线性表的顺序存储结构
定义:线性表的顺序存储是指将线性表中的元素存放在一组连续的存储单元中。这样的存储方式使得线性表逻辑上相连的元素,其在物理存储单元也是相邻的。采用顺序存储结构的线性表叫顺序表。
线性表存储结构示意图如下
由上图可知,只要知道第一个元素的起始地址,就可以得到线性表中任何一个元素的存储地址。
用数组描述线性表顺序存储结构代码
#define ListSize 100
typedef int DataType
typedef struct
{
DataType list[ListSize];
int length;
}SeqList
顺序存储结构封装需要3个属性
1:存储空间的起始地址 2:数组list 3:它的存储位置
线性表最大存储容量:ListSize
线性表当前长度:length
顺序表的基本运算代码
<pre name="code" class="html"><pre name="code" class="html"><span style="font-size:18px;">
/*初始化顺序表*/
void InitList(SeqList *L)
{
L->length = 0; //将线性表的长度置为0
}
//判断线性表是否为空
int ListEmpty(SeqList L)
{
if(L.length == 0) /*判断线性表的长度是否为0 */
return 1; //当线性表的长度为0时 ,返回1,否则返回0
else
return 0;
}
//查找线性表第i个元素,查找成功赋值给e,并返回1,失败则返回-1.
int GetElem(SeqList L,int i,DataType *e)
{
if(i<1 || i>L.length) //判断i是否合法
return -1;
*e = L.List[i-1]; //将第i个元素赋值给e
return 1;
}
//查找线性表中元素值为e的元素,查找成功返回该元素的序号,否则返回0表示失败
int LocateElem(SeqList L,DataType e)
{
int i,j=0;
for(i=0; i<L.length; i++) //从第一个元素开始比较
{ if( L.List[i] == e)
{ j++;
return i+1;
}
}
if(j == 0) //j = 0表示没有找到
return 0;
}
//在顺序表中第i个位置插入e,插入成功返回1,插入不合法返回-1,顺序表满返回0
int InsertList(SeqList *L, int i, DataType e)
{
int j;
if(i<1 || i>L->length + 1 )
{
printf("插入的位置i不合法! \n");
return -1;
}
else if(L->length >= ListSize)
{
printf("顺序表已满,不能插入! \n");
return 0;
}
else
{
for(j=L->length;j>=i;j--) //将第i个位置以后的元素一次后移
L->List[j] = L->List[j-1];
L->List[i-1] = e; //插入元素到第i个位置
L->length = L->length + 1; //将顺序表的长度加1
return 1;
}
}
//删除线性表第i个位置元素
int DeleteList(SeqList *L, int i,DataType *e)
{
int j;
if(L->length <= 0)
{
printf("顺序表已空,不能删除! \n");
return 0;
}
else if(i<1 || i>L->length )
{
printf("删除的位置i不合法! \n");
return -1;
}
else
{
*e = L->List[i-1];
for(j=i; j<=L->length-1;j++) //将第i个位置以后的元素依次前移
L->List[j-1] = L->List[j];
L->length = L->length - 1; //将顺序表的长度减1
return 1;
}
}
//返回线性表的长度
int ListLength(SeqList L)
{
return L.length;
}
//清空线性表
void ClearList(SeqList *L)
{
L->length = 0;
}
</span>
细说一下这个插入跟删除
插入,一个有n个元素的顺序表,其插入位置有n+1个,如图所示
在第i个元素插入,其后的每一个元素都要依次后移。故最坏情况,在开头插入数据,则以后的n个元素都要依次后移,故时间复杂度是O(n);故好情况就是在n+1处插入数据,已是最后,故不需要后移。则时间复杂度是O(1);
那随意第i个插入,平均时间复杂度是O(n/2),即是O(n)。
同样,删除也是如此,平均时间复杂度是O(n/2),即是O(n)。