欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据结构笔记2:顺序表中删除最小值元素

程序员文章站 2022-06-03 13:41:31
...

因Dev-C++不能在同一个项目中运行多个含有main函数的c++文件,所以后期笔记的代码实现全部用visual studio 实现,vs可以通过生成排除的方法将其他无用的c++ 文件排除(visual studio 安装和生成排除的方法可参考其他文章)。

我们将一些公共的方法放到头文件中,在其他子文件中直接调用方法即可,这样使代码更加简洁,结构更加明显,文件也好管理,执行哪一个文件将其他文件生成排除即可。
数据结构笔记2:顺序表中删除最小值元素
今天,碰到的这个题目不难,但是后来细想其中有些点值得深究。

题目: 从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值,空出的位置由最后一个元素填补,若顺序表为空则显示出错信息并退出运行。

当第一遍看到这个题目后,自己先想到的就是if语句套删除操作,后来实现了一下,后来发现与答案略有偏差,其实题目不涉及到任何的删除操作。

算法思想:搜索整个顺序表,查找最小值并记住其位置,搜索结束后,用最后一个元素填补空出的最小值的位置。

代码实现:

#include"head.h"//调用头文件
bool DelElem(SeqList &L, int &n) {
	if (L.length == 0) {
		return false;//表空,中止操作
	}
	n = L.data[0];
	int pos = 0;
	for (int i = 1; i < L.length; i++) {
		if (L.data[i] < n) {
			n = L.data[i];//让n来记忆最小值
			pos = i;
		}
	}
	L.data[pos] = L.data[L.length - 1];
	L.length--;
	return true;
}
int main() {
	SeqList L;
	InitList(L);
	int i;
	for (int i = 0; i < 10; i++) {//插入10个元素,自定义插入 
		ListInsert(L, i + 1, i + 1);
	}
	printf("原顺序表内容为:\n");
	for (int i = 0; i < L.length; i++) {
		printf("data[%d]=%d\n", i, L.data[i]);
	}
	int a;
	DelElem(L,a );
	cout << "最小值为" << a << "已删除,该位置已由最后一个元素补充\n";
	printf("删除最小值之后顺序表内容为:\n");
	for (int i = 0; i < L.length; i++) {
		printf("data[%d]=%d\n", i, L.data[i]);
	}
}

运行结果
数据结构笔记2:顺序表中删除最小值元素
为什么说不涉及任何的删除操作呢?

我的理解是:其实我们在声明n的时候就已经声明了一片内存空间,通过占座的方式将这片内存占住,顺序表中的最小值找到之后,将其转移到这片内存空间中,所以说原来的空间就没有数据了,也就是题目所谓的删除操作,后面用最后一个元素填补空出的最小值的位置。
以上均为个人理解,如有错误,还请各位大佬指教。