四、线性表的顺序存储
(1)结构
线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素,使得线性表在逻辑结构上
相邻的数据元素存储在连续的物理存储单元中,即通过数据元素物理存储的连续性来反映数据元素之间逻辑
上的相邻关系。
采用顺序存储结构存储的线性表通常简称为顺序表,可将顺序表归纳为:关系线性化,结点顺序化。
(2)表示
#define MAXSIZE 100 //线性表最多数据元素个数,即线性表的最大长度
typedef struct _Seqlist
{
ElemType elem[MAXSIZE] ; //各数据元素存储在一维数组中
int last; //最后一个元素的下标
}SeqList ;
注意区分元素的序号与该元素在数组中的下标位置之间的对应关系,即数组元素ai的序号是i,而其对应存放在
数组的下标为i-1。
(3)基本运算
《1》插入操作
思想:
在第i元素的位置上插入元素e ,就必须将原表中第i个元素开始到最有一个元素依次后移一个
元素空间,空出第i个元素的空间,然后将元素e存入到第i个元素的位置。
算法:
#define OK 1
#define ERROR 0
int InsList(SeqList *L,int i,ElemType e)
{
int k ;
if(L->last >= MAXSIZE-1) //判断是否允许插入
{
printf("线性表已满,无法插入\n") ;
return ERROR ;
}
if(i<1 || i>L->last+2) //判断插入位置是否合法
{
printf("插入位置不合法") ;
return ERROR ;
}
for(k = L->last;k>=i-1;k--) //向后移动元素
{
L->elem[k+1] = L->elem[k] ;
}
L->elem[i-1] = e ; //插入元素e
L->last++; //下标加1
return OK;
}
《2》删除操作
思想:
删除第i个元素后,就空出第i个元素的空间,为了保持元素空间的连续性,必须从表中第i+1个元素
开始到最有一个元素依次前移一个元素空间。
算法:
int DelList(SeqList *L,int i,ElemType *e)
{
int k ;
if(i<1 || i>L->last+1) //判断删除位置是否合法
{
printf("删除的位置不合法") ;
return ERROR ;
}
*e = L->elem[i-1]; //将删除的元素存放到e所指向的变量中
for(k = i;k<=L->last;k++) //向前移动元素
{
L->elem[k-1] = L->elem[k];
}
L->last --;
return OK;
}
(4)缺点
《1》插入或删除运算不方便,除表尾的位置以外,其他位置上的操作都必须移动大量的元素,效率较低。
《2》由于顺序表要求占用连续的存储空间,存储分配只能预先进行静态分配。因此难以确定合适的存储空间,
空间过大会造成浪费,空间过小会造成表溢出。