Bootstrap

第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 **********/
}

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;