2.2 线性表的顺序表示

一、顺序表的定义

1.线性表的顺序存储又称顺序表。它是用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。

2.线性表中元素的位序是从1开始的。

3.一维数组可以是静态分配的,也可以是动态分配的。在静态分配时,由于数组的大小和空间事先已经固定,一旦空间占满,再加入新的数据将会产生溢出,进而导致程序崩溃。而在动态分配时,存储数组的空间是在程序执行过程中通过动态存储分配语句分配的,一旦数据空间占满,就另外开辟一块更大的存储空间,用以替换原来的存储空间,从而达到扩充数组的目的。

4.假定线性表的元素类型为ElemType,则线性表的顺序存储类型描述为:
(1)
#define MaxSize 50 //定义线性表的最大长度
typedef struct
{
ElemType data[MaxSize]; //顺序表的元素
int length; //顺序表的当前长度
}SqList; //顺序表的类型定义

(2)
#define InitSize 100 //表长度的初始定义
typedef struct
{
ElemType *data; //指示动态分配数组的指针
int MaxSize,length; //数组的最大容量和当前个数
}SqList; //动态分配数组顺序表的类型定义

C的初始动态分配语句为:
L.data=(ElemType*)malloc(Sizeof(ElemType)*InitSize);

C++的初始动态分配语句为
L.data=new ElemType[InitSize];

5.顺序表最主要的特点是随机访问,即通过首地址和元素序号可在时间O(1)内找到指定的元素。顺序表的存储密度高,每个结点只存储数据元素。顺序表逻辑上相邻的元素物理上也相邻,所以插入和删除需要移动大量元素。

二、顺序表基本操作的实现

1.插入操作
在顺序表L的第i(1<=i<=L.length+1)个位置插入新元素e。若i的输入不合法,则返回false,表示插入失败;否则,将顺序表的第i个元素及其后的所有元素右移一个位置,腾出一个空位置插入新元素e,顺序表长度增加1,插入成功,返回true
bool ListInsert(SqList &L,int i,ElemType e)
{
if(i<=1||i>=L.length+1) //判断i的范围是否有效
return false;
if(L.length>MaxSize) //当前存储空间已满,不能插入
return false;
for(int j=L.length;j>=i;j–)//将第i个元素之后的元素后移
L.data[j]=L.data[j-1];
L.data[i-1]=e;//在位置i处放入e
L.length++;//线性表长度+1
return true;
}
最好情况:在表尾插入,元素不需要移动,时间复杂度为O(1)
最坏情况:在表首插入,所有元素都要移动,时间复杂度为O(n)
平均情况:平均移动次数为n/2,时间复杂发为O(n)

2.删除操作
删除顺序表L中第i(1<=i<=L.length)个位置的元素,若成功则返回true,并将被删除的元素引用变量e返回,否则返回false
bool ListDelete(SqList &L,int i,ElemType &e)
{
if(i<=1||i>=L.length+1) //判断i的范围是否有效
return false;
e=L.data[i-1]; //将被删除的元素赋值给e
for(int j=i;j<L.length;j++)//将第i个位置后的元素前移
L.data[j-1]=L.data[j];
L.length–;//线性表长度-1
}
最好情况:删除表尾元素,无需移动元素,时间复杂度为O(1)
最坏情况:删除表头元素,需要移动所有元素,时间复杂度为O(n)
平均情况:平均次数为(n-1)/2,时间复杂度围殴O(N)

3.按值查找(顺序查找)
在顺序表L中查找第一个元素值等于e的元素,并返回其位序
int LocateElem(SqList L,ElemType e)
{
int i;
for(i=0;i<L.length;i++)
if(L.data[i]==e)
return i+1;
return 0; //退出循环,说明查找失败
}
最好情况:查找的元素就在表头,比较一次,时间复杂度为O(1)
最坏情况:查找的元素在表尾或不存在,比较n次,时间复杂度为O(n)
平均情况:平均次数为(n+1)/2,时间复杂度为O(n)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值