线性表的顺序存储结构

1 线性表的顺序存储结构,是指用一段地址连续的存储单元依次存储线性表的数据元素。既然线性表的每个数据元素类型都相同,所以可以用一维数组来实现顺序存储结构,即把第一个元素存储在下标为0的位置上,接着把线性表相邻的元素存储在数组中相邻的位置。
2 线性表顺序存储的结构代码

#define MAXSIZE 20        //存储空间初始分配量
typedef int ElemType;     //ElemType表示类型,这里假设为int
typedef struct {
    ElemType data[MAXSIZE];    //数组存储数据元素,最大值为MAXSIZE
    int length;                //线性表当前长度
} SqList;

说明:描述顺序存储结构需要三个属性
(1)存储空间的起始位置:数组data,它的存储位置就是存储空间的存储位置。
(2)线性表的最大存储容量:数组长度MAXSIZE
(3)线性表的当前长度:length

3 顺序存储结构的插入和删除

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;

(1)用e返回数组L中第i个数据元素的值

Status getElem(SqList L, int i, ElemType *e) {
  if (L.length <= 0 || i < 1 || i > L.length) {
      return ERROR;
  }  
  *e = L.data[i - 1];
  return OK;
}

时间复杂度为O(1).

(2)在线性表第i个位置插入元素e
/* 初始条件:顺序线性表L已存在,i的取值范围为1 <= i <= L->length + 1 */
/* 操作结果:在L中第i个位置之前插入e,L的长度加1 */

Status ListInsert(SqList *L, int i, ElemType e) {
  int k;
  if (L->length == MAXSIZE) {    //线性表已满
      return ERROR;
  }
  if (i < 1 || i > L->length + 1) {    //插入的位置不在范围内
      return ERROR;
  }
  if (i <= L-> length) {    //不是插入在队尾
      for (k = L-> length - 1; k >= i - 1; k--) {
          L->data[k + 1] = L->data[k];
      }
  }
  L->data[i - 1] = e;
  L->length ++;
  return OK;
}

(3) 删除第i个位置的元素,并用e返回其值
/* 初始条件:顺序线性表L已存在,i的取值范围为1 <= i <= L->length */
/* 操作结果:删除L中第i个数据元素,L的长度减1 */

Status ListDelete(SqList *L, int i, ElemType *e) {
  int
k;   if (L->length == 0) {    return ERROR;   }   if (i < 1 || i > L-> length) {    return ERROR;   }   *e = L->data[i - 1];   if (i < L->length) { //不是删除队尾元素    for (k = i; k <= L->length - 1; i++) {    L->data[k-1] = L->data[k];    }   }   L->length --;   return OK; }

(4)时间复杂度
如果插入到最后一个位置,或者删除最后一个元素,时间复杂度为O(1)。最坏情况,即插入到第一个位置、或者删除第一个元素,此时时间复杂度为O(n).平均时间为(n-1)/2.故时间复杂度为O(n).

原文地址:https://www.cnblogs.com/muzijie/p/5617051.html