数据元素的地址计算公式:L(ai)=L(a1)+(i-1)*c (c为一个数据元素所占的存储量。)
顺序表结构图。
1静态顺序存储结构
//顺序表的静态存储结构。
#define MaxSize 80
typedef struct{
ElemType elem[MaxSize];
int length;//当前表的长度。
}Sqlisttp;
//静态线性表的初始化
status InitList(Sqlisttp&L){
L.length=0;
return 0;
}
//静态顺序表上实现插入操作。
status ListInsert_sqtp(SqListtp&L,int i,ElemType e){
if(i<1||i>L.length) return ERROR;//i值不合法 ,i指的是第几个元素。(1<=i<=L.length;
if(L.length>=MaxSize) return OVERFLOW;//当前存储空间已满。
for(j=L.length;j>=i-1;--i){
L.elem[j+1]=L.elem[j];
}
L.elem[i-1]=e;
++L.length;
return ok;
}
//插入操作的基本步骤,
//检测
//后移
//插入
//修正表长(表长加1)
2动态顺序表存储结构
//动态顺序存储结构的描述。
#define LIST_INIT_SIZE 100// 线性表存储空间的初始分配量
#define LISTCREAMENT 10 // 线性表存储空间的分配增量
typedef struct{
ElemType*elem;//存储空间基址
int length;//当前长度
int listsize;//当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;
//动态线性表的初始化。
status InitList(SqList&L){
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem) exit(OVERFLOW);//存储分配失败
L.length=0;//空表长度为0
L.listsize=LIST_INIT_SIZE;//初始存储容量。
return ok;
}
//动态顺序表的插入
ListInsert_sq(&L,i,e);
//动态顺序表L中第i个元素ai前插入一个值为e的元素,其中1<=i<=L.length+1
主要操作步骤及其实现方法。

1.检测(判断参数i是否合理即及空间是否满)。
i) i<1 ||i>L.length+1
ii) L.length>=L.listsize 则空间已满,需要增加分配空间。
2.后移(插入位置及之后的所有元素后移一位。)
q=&(L.elem[i-1]);//q指示插入位置。
for(p=&(L.eleme[L.length-1]);p>=q;--p){
*(p+1)=*p;//后移一位。
}
3.插入(将元素插入到指定位置上)
*q=e;//插入e
4.修正表长(表长加+1)
++L.length;//表长增1;
实现算法。
status ListInsert_sq(SqList&L,int i,ElemType e){
if(i<1||i>L.length+1) return ERROR;
if(L.length>=L.listsize){
newbase=(ElemType*)realloc(L.elem,(listsize+LISTINCRENMENT).sizeof(ElemType));
if(!newbase) exit(OVERFLOW);
L.elem=L.newbase;
L.listsize+=LISTCREAMENT;
}
q=&(L.elem[i-1]);
for(p=&(L.elem[L.length-1]);p>=q;--p){
*(p+1)=*p;
}
*q=e;
++L.length;
return ok;
}
//顺序表的删除。
ListDelete_sq(SqList&L,int i,ElemType &e)
动态顺序表L中删除第i个元素ai,并返回e, (1<=i<=n):
操作步骤及其实现
1.检测(判断参数i是否合理)
i<1||i>L.length,删除位置不合理,算法结束。
2.前移(删除元素之后的所有元素前移一位).
p=&(L.elem[i-1]);//p指示删除位置
e=*p;//用e返回被删元素的值。
q=&(L.elem[L.length-1];//p指示表尾位置。
for(++p;p>=q;++p){
*(p-1)=*p;
}
实现算法:
status ListDelete_sq(SqList&L,int i,ElemType&e){
if(i<l||i>L.length) return ERROR;
p=&(L.elem[i-1]);
e=*p;//记录被删除元素的值。
q=&(L.elem[L.length-1]);
for(++p;p<=q;++p){
*(p-1)=*p;
}
--L.length;
return ok;
}
题目:有序顺序表中删除所有重复数据元素的算法。
status delSqList(SqList &L){
i=0;
while(i<L.length-1){
if(L.elem[i-1]==L.elem[i+1]){
for(j=i+1;j<L.length;j++){
L.elem[j-1]=L.elem[j];
}
--L.length;//修正表长。
}else{
i++;
}
}
return ok;
}