线性表是一个具有相同特性的数据元素的有限序列。




顺序存储结构就是把线性表中所有的元素按照顺序存储方法进行存储。
按逻辑顺序依次存储在存储器中一片连续的存储空间中。

typedef struct
{
ElemType data[MaxSize];
int length;
};SqList;//顺序表类型
假设ElemType为char类型。
其中data成员存放元素,length成员存放线性表的实际长度。
注:逻辑位序和物理位序相差1。
1.建立顺序表
a[0…n-1]
⇒
\Rightarrow
⇒顺序表L——整体创建顺序表。
void CreateList(SqList *&L,ElemType a[],int n) //L表示顺序表中的指针
{
int i=0,k=0;
L=(SqList *)malloc(sizeof(SqList));
while(i<n) //i扫描a中元素
{
L->data[k]=a[i];
k++; //k记录插入到L中的元素个数
i++;
}
L->length=k;
}
其中,

构造一个空的线性表L。实际上只需将length成员设置为0即可。
void InitList(SqList *&L)
{
L=(SqList *)malloc(sizeof(SqList)); //分配存放线性表的顺序表空间
L->length=0;
}
释放线性表L占用的存储空间。
void DestroyList(SqList *&L)
{
free(L); //释放L所指向的内存空间
}
顺序表采用指针传递的优点:
回一个值表示L是否为空表。若L为空表,则返回ture,否则返回false。
bool ListEmpty(SqList *L)
{
return(L->length==0);
返回顺序表L的长度。实际上只需要返回length成员的值即可。
int ListLength(SqList *L)
{
return(L->length);
}
当线性表不为空时,顺序显示L中个元素的值。
void DispList(SqList *L)
{
int i;
if(ListEmpty(L))
return;
for(i=0;L->length;i++)
printf("%c",L->data[i]);
printf("\n");
}
返回L中第i(1<=i<=ListLength(L))个元素的值,存放在e中。
bool GetElem(SqList *L,int i,ElemType &e)
{
if(i<1||i>L->length)
return false;
e=L->data[i-1];
return true;
}
本算法时间复杂度为0(1)。体现顺序表的随机存取特性。
顺序查找第一个值与e相等的元素的逻辑位序,若这样的元素不存在,则返回值为0。
int LocateElem(SqList *L,ElemType e)
{
int i=0;
while(i<L->length&&L->data[i]!=e)
i++;
if(i>=L-length)
return 0;
else return i+1;
}
在顺序表L的第i(1<=i<=ListLength(L)+1)个位置上插入新的元素e。

算法如下:
bool ListInsert(SqList *&L,int i,ElemType e)
{
int j;
if(i<1||i>L->Length+1)
return false; //参数错误时返回false
i--; //将顺序表逻辑序号转化为物理序号
for(j=L->Length;j>i;j--) //将data[i...n]元素后移一位
L->data[j]=L->data[j-1];
L->data[i]=e; //插入元素e
L->length++; //顺序表长度增加1
return ture; //成功插入返回ture
}
插入方式如图所示:

对于该算法:
删除顺序表L中第i(1<=i<=ListLengh(L))个元素。
bool ListDelete(SqList *&L,int i,ElemType &e)
{
int j;
if(i<1||i>L->length)
return false; //此处作用为卡i的范围,判断i的值是否合法
i--; //执行这一步是因为数组都是从0开始取的,这样可以将逻辑位序转换化成物理位序
e=L->data[i];
for(j=1;j<L->length-1;j++)
L->data[j]=L->data[j+1]; //将数据表的每个元素前移一位
L->length--; //顺序表长度减少一位
return true; //删除成功
}
解释:此处声明函数之所以使用&,对于L目的是使其在该函数与main函数中指向同一地址,对于e,目的是使其在main函数与该函数对应同一份数据。
对于该算法,元素移动次数也与删除元素的位置有关
