有15个数按由大到小顺序存放在一个数组_C语言-线性表的定义和逻辑结构-顺序表的操作(三)...

顺序表的操作


在线性表

956f98c7e748f63b02593f67abd540aa.png

的第i (1≤i≤n+1)个数据元素前插入一个新的同类型数据元素x,使A成为一个长度为n+1的线性表,x成为新表中的第i号元素。插入后的线性表为

62ce34e1da762ca987fa2df2dcb68e04.png

,用MAX表示数组的元素个数。

c6a55d325220cc4203fa30329aaee393.png

表示一个线性表在进行插入前后,其数据元素在数组中的位置变化

顺序存储结构线性表的插入算法

#define MAX 100void main()/*在a[i]之前插入数据元素,MAX是数组元素的个数,a[0]用以存放当前线性表的长度,b存放待插入的数据,i存放插入的位置,n存放待操作的线性表的长度*/{int a[MAX];int i,j,b,n;scanf(“%d%d%d”,&b,&i,&n); /*输入相应数据*/for(j=1;j<=n;j++)scanf(“%d”,&a[j]); /*把线性表的数据元素输入到数组中*/a[0]=n; /*a[0]存放线性表的长度*/for(j=n;j>=i;j--)a[j+1]=a[j]; /*向后平移数据元素*/  为关键语句a[i]=b; /*插入*/a[0]=n+1; /*线性表长度增加1*/ for(j=1;j<=a[0];j++),{printf(“%5d”,a[j]); /*输出新的线性表*/}}

顺序表的删除操作

在线性表

d440a1a9df709c38261024ec0a3fe9a2.png

中删除第i个元素ai(1≤i≤n),删除后线性表长度为n-1,删除后的线性表为

d440a1a9df709c38261024ec0a3fe9a2.png
669581d0ac02cc83795c951509d893a3.png

一个线性表在进行删除前后,其数据元素在数组中的位置变化

顺序表的删除操作

#define MAX 100void main()/*删除a[i]中的数据元素,得到一个顺序存储的新的线性表,MAX是数组元素的个数,a[0]用以存放当前线性表的长度,i用以存放要删除数据元素所在数组元素的下标。n存放待操作的线性表的长度*/{int a[MAX];int i, j, n;scanf(“%d%d”,&i,&n); /*输入相应数据*/for(j=1;j<=n;j++){scanf(“%d”,&a[j]); /*把线性表的数据元素输入到数组中*/}a[0]=n; /*a[0]存放线性表的长度*/for(j=i+1;j<=n;j++)a[j-1]=a[j]; /*向前平移数据元素*/  为关键语句a[0]=a[0]-1; /*线性表长度减1*/for(j=1;j<=a[0];j++){printf(“%5d”,a[j]); /*输出新的线性表*/}}

插入、删除操作的时间复杂度分析

线性表长度为n,问题规划n,基本操作为“移动”

对于插入操作(共有n+1种情况)

插入位置移动次数

i=n+10

i=1n

其他情况n-i+1

等概率平均移动次数=n/2,时间复杂度为O(n)。

(1)对于插入操作,设插入位置是在第i个元素之前(也就是插入元素作为新表的第i个元素),有下列四种情况:

当i=1时移动元素次数为n;

当i=n+1时,移动元素次数为0;

一般情况下,移动元素的次数为n-i+1;

等概率情况下平均移动次数为n/2,由下列公式求得:

5c0c0914fa335f46cd8fd38df974a2a9.png

(2)对于删除操作,有下列四种情况:

当i=1时,移动元素次数为n-1;

i=n时,移动元素次数为0;

一般情况下,移动次数n-i;,/

等概率情况下平均移动次数为(n+1)/2。计算公式为:

be37991cf983123dbd6c98cb38792e57.png

由此可见,在顺序存储结构的线性表中插入或删除一个数据元素,平均需要移动表中一半元素,因而上述两个算法的时间复杂度为O(n),当n很大时,顺序存储结构下的线性表的插入、删除操作效率是很低的。

顺序存储的优缺点有哪些?

优点:结点的逻辑次序与物理次序完全一致,简单、直观,可以随机进行访问。缺点:需要预留足够的空间、需要连续空间,插入、删除操作时需要移动大量的元素,使程序执行时间变长,在预分配存储空间时,可能造成空间的浪费。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值