任务描述
本关任务:编写顺序表的删除操作函数。
相关知识
线性表的删除运算是指将表的第i
(1≤i≤n
)个元素删去,使长度为n
的线性表 ( a1
,…,ai−1
,ai
,ai+1
,…,an
),变成长度为n-1
的线性表( a1
,…,ai−1
,ai+1
,…,an
)。
算法思想:在顺序表上实现删除运算必须移动结点,才能反映出结点间的逻辑关系的变化。若i=n
,则只要简单地删除终端结点,无须移动结点;若1≤i≤n-1
,则必须将表中位置i+1
,i+2
,…,n
的结点,依次前移到位置i
,i+1
,…,n-1
位置上,以填补删除操作造成的空缺。
算法分析:
- 最好的情况:当
i=n
时(删除尾元素),移动次数为0
; - 最坏的情况:当
i=1
时(删除第一个元素),移动次数为n-1
; - 平均情况:删除位置
i
的元素ai
,需要将ai+1~an
的元素均前移一次,移动次数为n-(i+1)+1=n-i
。假设在等概率下pi(pi=1/n)
,移动元素的平均次数为:
删除算法的主要时间花费在元素移动上,所以算法的平均时间复杂度为O(n)
。
编程要求
根据提示,在右侧编辑器 Begin-End 区间补充代码,完成顺序表的删除操作函数的定义,具体要求如下:
int ListDelete(SqList &L,int i,ElemType &e) //删除顺序表L的第i个数据元素,并用e返回其值,L的长度减1
测试说明
平台会对你编写的代码进行测试:
测试输入: 5
12 47 5 8 69
1
预期输出: 删除成功,删除后顺序表如下:
47 5 8 69
删除元素的值:12
测试输入: 5
12 47 5 8 69
6
预期输出: 删除位置不合法,删除失败!
输入说明 第一行输入顺序表的长度M; 第二行输入顺序表的M个整数; 第三行输入要删除元素的位置;
输出说明 第一行输出删除是否成功的提示信息; 如果删除成功,第二行输出删除元素后的顺序表;第三行输出删除的数据元素;如果删除位置不合法,不输出第二行和第三行。
int ListDelete(SqList &L,int i,ElemType&e)
{
// 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)
// 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1
/********** Begin **********/
if((i<1)||(i>L.length)) return 0;
e=L.elem[i-1];
for(int j=i;j<=L.length-1;j++){
L.elem[j-1]=L.elem[j];
}
L.length--;
return 1;
/********** End **********/
}