数据结构笔记2:顺序表中删除最小值元素
程序员文章站
2022-06-03 13:41:31
...
因Dev-C++不能在同一个项目中运行多个含有main函数的c++文件,所以后期笔记的代码实现全部用visual studio 实现,vs可以通过生成排除的方法将其他无用的c++ 文件排除(visual studio 安装和生成排除的方法可参考其他文章)。
我们将一些公共的方法放到头文件中,在其他子文件中直接调用方法即可,这样使代码更加简洁,结构更加明显,文件也好管理,执行哪一个文件将其他文件生成排除即可。
今天,碰到的这个题目不难,但是后来细想其中有些点值得深究。
题目: 从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值,空出的位置由最后一个元素填补,若顺序表为空则显示出错信息并退出运行。
当第一遍看到这个题目后,自己先想到的就是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]);
}
}
运行结果
为什么说不涉及任何的删除操作呢?
我的理解是:其实我们在声明n的时候就已经声明了一片内存空间,通过占座的方式将这片内存占住,顺序表中的最小值找到之后,将其转移到这片内存空间中,所以说原来的空间就没有数据了,也就是题目所谓的删除操作,后面用最后一个元素填补空出的最小值的位置。
以上均为个人理解,如有错误,还请各位大佬指教。
上一篇: PHP 分页类(模仿google)-面试题目解答_php技巧
下一篇: 权限控制的一个思路