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).