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