线性表的顺序表示

线性表的顺序存储又称为顺序表,它用一组地址连续的存储单元,依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。
在这里插入图片描述
线性表中的元素位序从1开始,而数组中元素的下标从0开始

可以采用一位数组来实现顺序存储结构。一位数组可以是静态分配,也可以是动态分配。静态分配数组大小事先固定,一旦空间占满,再加数据则产生溢出。

线性表的元素类型为ElemType则顺序存储类型描述为:

  • 静态分配
#define MaxSize 50
/*顺序表类型定义*/
typedef struct
{
	ElemType list[MaxSize];
	int length;
}SeqList;
  • 动态分配
#define InitSize 50
/*顺序表类型定义*/
typedef struct
{
	ElemType *data;
	int MaxSize ,length;
}SeqList;

c语言初始化动态分配语句为:

#define InitSize 100
SeqList L;
L.data=(ElemType*)malloc(sizeof(ElemType)*InitSize);

注意:动态分配并不是链式存储,同样还是顺序存储结构,其物理结构没有改变。只是分配空间大小可以在运行时决定。

顺序表的特点随机访问,存储密度高,删除和插入操作需要移动大量数据。

插入操作

在顺序表L的第i(1≤i≤L.length+1)个位置插入新元素e。如果 i 的输入不合法,则返回false,表示插入失败;否则,将顺序表的第 i 个元素以及其后的所有元素右移一个位置,腾出一个空位置插入新元素e,顺序表长度增加1,插入成功,返回true。

算法思路:
1.判断 i 的值是否正确
2.判断表长是否超过数组长度
3.从后向前到第 i 个位置,分别将这些元素都向后移动一位
4.将该元素插入位置 i 并修改表长
在这里插入图片描述

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;
}

PS:bool 是布尔类型它只有true和false两种值,分别表示真和假。

最好情况:在表尾插入(即i=n+1),元素后移语句将不执行,时间复杂度为O(1)。
最坏情况:在表头插入(即i=1),元素后移语句将执行n次,时间复杂度为O(n)。
平均情况:假设pi(pi=1/(n+1) )是在第i个位置上插入一个结点的概率,则在长度为n的线性表中插入一个结点时所需移动结点的平均次数为
在这里插入图片描述
线性表插入算法的平均时间复杂度为O(n)

删除操作

删除顺序表L中第i(1≤i≤L.length)个位置的元素,成功则返回true,并将被删除的元素用引用变量e返回,否则返回false。

算法思路:
1.判断 i 的值是否正确
2.取删除的元素
3.将被删元素后面的所有元素都依次向前移动一位
4.修改表长
在这里插入图片描述

bool ListDelete(SqList &L, int i, Elemtype &e){ 
	if(i<1||i>L.length) //判断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
	return true;
}

最好情况:删除表尾元素(即i=n),无须移动元素,时间复杂度为O(1)。
最坏情况:删除表头元素(即i=1),需要移动除第一个元素外的所有元素,时间复杂度为O(n)。
平均情况:假设pi(pi=1/n)是删除第 i 个位置上结点的概率,
则在长度为n的线性表中删除一个结点时所需移动结点的平均次数为
在这里插入图片描述
线性表删除算法的平均时间复杂度为O(n)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值