数据结构(四)–顺序表的操作
一. 插入操作
4.1 实现目标:在顺序表L的第i(1≤i≤Length+1)个位置插入新元素。如果i的输入不合法,则返回False,表示插入失败,否则,将顺序表的第i个元素以及其后的所有元素都右移一个位置,腾出一个空位置来插入新元素e,顺序表长度增加1,插入成功,返回True.
4.2 算法思路:
- 判断i的值是否正确
- 判断表长是否超过数组长度
- 从后向前到第i个位置,分别将这些元素都往后移动一位
- 将该元素插入位置i并修改表长
4.3 具体实现
bool ListInsert(SqList & L, int i, ElemType e){
if(i<1 || i>L.length+1)
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++;
return true;
}
4.4 分析顺序存储的插入算法
最好情况:在表尾插入(即i=n+1),元素后移语句将不执行,时间复杂度为O(1).
最坏情况:在表头插入(即i=1),元素后移语句将执行n次,时间复杂度为O(n)
平均情况:假设pi(pi=1/(n+1))是在第i个位置上插入一个结点的概率,则在长度为n的线性表中插入一个结点时所需移动结点的平均次数是:
∑ i = 1 n + 1 p i ( n − i + 1 ) = ∑ i = 1 n + 1 1 n + 1 ( n − i + 1 ) = 1 n + 1 ∑ i = 1 n + 1 ( n − i + 1 ) = 1 n + 1 ( n ( n + 1 ) 2 ) = n 2 \sum_{i=1}^{n+1}{p_i(n-i+1)}=\sum_{i