25计算机考研,数据结构知识点整理(内容借鉴了王道408+数据结构教材),还会不断完善所整理的内容,后续的内容也会不断更新(可以关注),若有错误和不足欢迎各位朋友指出!
目录
一.删除操作
顺序表的删除运算是指在表的第i(1≤i≤n+1)元素删去,使长度为n的顺序表(,…,
,
,…,
)变成长度为n1的顺序表(
,…,
,
,…,
)(其中n为L的表长度)。
1.算法思想
用顺序表作为线性表的存储结构时,由于结点的物理顺序必须和结点的逻辑顺序保持一致,因此当需要删除第i个元素时,必须将原表中位置在i+1,i+2,…,n-1,n上的结点,依次前移到位置i,i+1,…n-1(其中n为的表长度)。
2.算法描述
int DelList(SeqList * L,int i,ElemType * e)
//在顺序表L中删除第i个数据元素,并用指针参数e返回其值。i的合法取值为1≤i≤L->last+1
{
int k;
if((i<1)||(i>L->last+1))
{
printf("删除位置不合法!");
return( ERROR);
}
*e=L->elem[i-1];/*将删除的元素存放到e所指向的变量中*/
for(k=i;i<=L->last;k++)
L->elem[k-1]=L->elem[k]; //将后面的元素依次前移
L->last--;
return(OK);
}
3.算法分析
最好情况:当删除表尾(i=L->last+1)元素时,因为循环变量的初值大于终值,此时不需要移动元素,仅将表长度减1即可,时间复杂度为O(1)。
最坏情况:当删除表头元素(i=1)时,需要移动除表头元素以外的所有元素,移动元素的语句L->elem[k-1]=L->elem[k]需执行n-1次。因此,删除算法中移位语句L->elem[k-1]=L->elem[k]的执行频度与删除位置i有关。时间复杂度为O(n)。因此,语句L->elem[k+1]=L->elem[k]的语句执行频度与插入位置i有关。
平均情况:设为在长度为n的表中删除一个元素所需移动元素的平均次数,假设
为在第i个元素之前删除元素的概率,并假设在任何位置上删除的概率相等,
=1/(n+1),i=1,2,n+1,则有
因此,顺序表的删除算法的平均时间复杂度为O(n) 。