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

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

我们将一些公共的方法放到头文件中,在其他子文件中直接调用方法即可,这样使代码更加简洁,结构更加明显,文件也好管理,执行哪一个文件将其他文件生成排除即可。

头文件代码

//头文件内包含了定义一个动态数组,初始化数组,插入方法。
#include <iostream>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
#define InitSize 10
typedef struct {
	int* data;//指示动态分配数组的指针 
	int Maxsize;//顺序表的最大容量 
	int length;//顺序表的当前长度 
}SeqList;
//初始化数组 
void InitList(SeqList& L) {
	//用malloc函数申请一片连续的存储空间
	L.data = (int*)malloc(InitSize * sizeof(int));
	L.length = 0;
	L.Maxsize = InitSize;
}
//增加动态数组的长度 
void IncreaseSize(SeqList& L, int len) {
	int* p = L.data;
	L.data = (int*)malloc((L.Maxsize + len) * sizeof(int));
	for (int i = 0; i < L.length; i++) {
		L.data[i] = p[i];//将数据复制到新区域 
	}
	L.Maxsize = L.Maxsize + len;//顺序表最大长度增加len 
	free(p); //释放原来的内存空间 
}
//插入操作
bool ListInsert(SeqList& L, int i, int e) {
	if (i<1 || i>L.length + 1) {//判断i是否有效 
		return false;
	}
	//if(L.length>= L.Maxsize){//当前存储空间已满,不能插入 
		//return false;
	//}
	if (L.length >= L.Maxsize) {
		IncreaseSize(L, 10);//动态扩大数组空间,如果数据个数大于数组最大空间,每次加10个 
	}
	for (int j = L.length; j >= i; j--) {//将地i个元素及以后的元素后移 
		L.data[j] = L.data[j - 1];
	}
	L.data[i - 1] = e;//在位置i处放置e 
	L.length++;//表长度加1 
	return true;
}
//输出操作
void printList(SeqList L)
{
	for (int i = 0; i < L.length; i++)
		printf("data[%d]=%d\n", i, L.data[i]);
	cout << endl;
}

文件结构截图

在这里插入图片描述
今天,碰到的这个题目不难,但是后来细想其中有些点值得深究。

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

当第一遍看到这个题目后,自己先想到的就是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的时候就已经声明了一片内存空间,通过占座的方式将这片内存占住,顺序表中的最小值找到之后,将其转移到这片内存空间中,所以说原来的空间就没有数据了,也就是题目所谓的删除操作,后面用最后一个元素填补空出的最小值的位置。
以上均为个人理解,如有错误,还请各位大佬指教。

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值