顺序表的操作
在线性表
![956f98c7e748f63b02593f67abd540aa.png](https://i-blog.csdnimg.cn/blog_migrate/1d9e87c43d4dd9ed7900bfff3add6c49.jpeg)
的第i (1≤i≤n+1)个数据元素前插入一个新的同类型数据元素x,使A成为一个长度为n+1的线性表,x成为新表中的第i号元素。插入后的线性表为
![62ce34e1da762ca987fa2df2dcb68e04.png](https://i-blog.csdnimg.cn/blog_migrate/0532f731bc35d5a8b57ee1eab480dcc8.jpeg)
,用MAX表示数组的元素个数。
![c6a55d325220cc4203fa30329aaee393.png](https://i-blog.csdnimg.cn/blog_migrate/c6ac2f034ea293b4aeb0d47bacfe9eb4.jpeg)
表示一个线性表在进行插入前后,其数据元素在数组中的位置变化
顺序存储结构线性表的插入算法
#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](https://i-blog.csdnimg.cn/blog_migrate/3aba365e273d4cee44557ed3904baf56.jpeg)
中删除第i个元素ai(1≤i≤n),删除后线性表长度为n-1,删除后的线性表为
![d440a1a9df709c38261024ec0a3fe9a2.png](https://i-blog.csdnimg.cn/blog_migrate/3aba365e273d4cee44557ed3904baf56.jpeg)
![669581d0ac02cc83795c951509d893a3.png](https://i-blog.csdnimg.cn/blog_migrate/ffa39bb9b39e370eea52a52b6da2be7b.jpeg)
一个线性表在进行删除前后,其数据元素在数组中的位置变化
顺序表的删除操作
#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](https://i-blog.csdnimg.cn/blog_migrate/a4fc0dca1e3de3d5ab62e007dcd3abc1.jpeg)
(2)对于删除操作,有下列四种情况:
当i=1时,移动元素次数为n-1;
i=n时,移动元素次数为0;
一般情况下,移动次数n-i;,/
等概率情况下平均移动次数为(n+1)/2。计算公式为:
![be37991cf983123dbd6c98cb38792e57.png](https://i-blog.csdnimg.cn/blog_migrate/9f2d056783c08a6acdb6a406cffb88b9.jpeg)
由此可见,在顺序存储结构的线性表中插入或删除一个数据元素,平均需要移动表中一半元素,因而上述两个算法的时间复杂度为O(n),当n很大时,顺序存储结构下的线性表的插入、删除操作效率是很低的。
顺序存储的优缺点有哪些?
优点:结点的逻辑次序与物理次序完全一致,简单、直观,可以随机进行访问。缺点:需要预留足够的空间、需要连续空间,插入、删除操作时需要移动大量的元素,使程序执行时间变长,在预分配存储空间时,可能造成空间的浪费。