搞懂线性表

111 阅读1分钟

“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 11 天,点击查看活动详情

顺序表综合应用题

1.1.题目描述

从顺序表中删除最小值的元素(假设是唯一的),并且由函数返回被删除元素的值。空出的位置由最后一个元素填补,如果顺序表为空,那么显示错误信息并且与退出运行。

1.2.算法思想

搜索整个顺序表(线性表),查找到最小的值并且记录位置,搜索结束后用最后一个元素填补空出来的位置。

1.3.代码展示

L:顺序表(线性表);value:引用型参数返回其值;

bool Del_Min(SqList &L,ElemType &value){
	
	if(L.length==0)
	return false;
	value=L.data[0];
	
	int pos=0;//假设第0个元素最小
	for(int i=1;i<L.length;i++)
	if(L.data[i]<value){//让value来记录当前具有最小值的元素
		value=L.data[i];
		pos=i;
	} 
	L.data[pos]=L.data[L.length-1];//空出的位置由最后一个元素填补
	L.length--;
	return true; //此时value为最小值
}

注意区别函数返回值和参数返回:

  • 函数返回值只能返回一个值。
  • 参数返回(引用传参)可以返回多个值。

2.1.题目描述

设计一个高效算法,将顺序表逆置,要求算法的空间复杂度为 O(1)。

2.2.算法思想

扫描顺序表的前半部分的元素,对于元素L.datai,将其与后部分的对应元素L.data[L.length-i-1]进行交换。

2.3代码展示

temp:辅助变量;交换L.data[i]和L.data[L.length-i-1]

void Reverse(SqList &L){
	ElemType temp;
	for(int i=0;i<L.length/2;i++)
	temp=L.data[i];
	L.data[i]=L.data[L.length-i-1];
	L.data[L.lenth-i-1]=temp;
}

代码思路:

首先添加 pos 位置的限定条件,限定 pos >= 0 并且 pos <= psl->size 从而保证 pos 合法。然后,因为是插入所以免不了要检查增容,直接调用之前写好的检查增容的函数即可。检查完后就可以开始移动了,和头插差不多,我们创建一个变量 end 记录最后一个的下标(psl->size-1),并通过它来指向要移动的数据。最后进入 while 循环,以 end >= pos 作为条件。移动完后,x 的位置就腾出来了,再把 x 插入进去,最后再 size++,就完成了。

“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 11 天,点击查看活动详情