第2关:顺序表的删除操作

任务描述

本关任务:编写顺序表的删除操作函数。

相关知识

线性表的删除运算是指将表的第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+1i+2,…,n的结点,依次前移到位置ii+1,…,n-1位置上,以填补删除操作造成的空缺。

顺序表删除

算法分析

  1. 最好的情况:当i=n时(删除尾元素),移动次数为0
  2. 最坏的情况:当i=1时(删除第一个元素),移动次数为n-1
  3. 平均情况:删除位置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 **********/
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值