王道数据结构代码讲解
从顺序表中删除最小值的元素(假设唯一),并由函数返回被删除元素的值。空出的位置由最后一个元素填补。若顺序表为空,则显示出错信息并退出运行
第一步,为了做到题目要求的创建一个顺序表,需要先定义顺序表的数据结构。
#define MaxSize 50 // 定义顺序表的最大长度
typedef int ElemType; // 定义顺序表存储的元素类型为int// 定义顺序表的结构体
typedef struct{ElemType data[MaxSize]; // 存储元素的数组int length; // 顺序表当前长度
}SqList;
第二步,为了做到题目要求的删除顺序表中的最小值元素,需要先定义一个函数来实现这个功能。
// 定义删除最小元素的函数
bool DelMinSqlist(SqList &L, ElemType &e) {if(L.length == 0) { // 如果顺序表为空,则返回falsereturn false;}e = L.data[0]; // 假设第一个元素是最小的int pos = 0; // 记录最小元素的位置for(int i = 1; i < L.length; i++) { // 遍历顺序表if(L.data[i] < e) { // 如果找到更小的元素e = L.data[i]; // 更新最小元素pos = i; // 更新最小元素的位置}}L.data[pos] = L.data[L.length - 1]; // 将最后一个元素移动到最小元素的位置L.length--; // 顺序表长度减1return true; // 返回true表示删除成功
}
第三步,为了做到题目要求的初始化顺序表并添加元素,需要先编写main函数。
int main() {SqList L; // 创建顺序表LL.length = 0; // 初始化顺序表长度为0for(int i = 0; i < 20; i++) { // 循环添加20个元素L.data[i] = 25 - i; // 元素值从25递减到5L.length++; // 顺序表长度加1}ElemType e; // 用于存储被删除的最小元素的值bool ret = DelMinSqlist(L, e); // 调用函数删除最小元素if(ret) { // 如果删除成功printf("e=%d\n", e); // 打印被删除的元素} else { // 如果删除失败printf("fail\n");}// 打印剩余的顺序表元素,以验证删除操作for(int i = 0; i < L.length; i++) {printf("%d ", L.data[i]);}printf("\n");return 0;
}
完整代码:
#include <stdio.h>#define MaxSize 50 // 定义顺序表的最大长度
typedef int ElemType; // 定义顺序表存储的元素类型为int// 定义顺序表的结构体
typedef struct{ElemType data[MaxSize]; // 存储元素的数组int length; // 顺序表当前长度
}SqList;// 定义删除最小元素的函数
bool DelMinSqlist(SqList &L, ElemType &e) {if(L.length == 0) { // 如果顺序表为空,则返回falsereturn false;}e = L.data[0]; // 假设第一个元素是最小的int pos = 0; // 记录最小元素的位置for(int i = 1; i < L.length; i++) { // 遍历顺序表if(L.data[i] < e) { // 如果找到更小的元素e = L.data[i]; // 更新最小元素pos = i; // 更新最小元素的位置}}L.data[pos] = L.data[L.length - 1]; // 将最后一个元素移动到最小元素的位置L.length--; // 顺序表长度减1return true; // 返回true表示删除成功
}int main() {SqList L; // 创建顺序表LL.length = 0; // 初始化顺序表长度为0for(int i = 0; i < 20; i++) { // 循环添加20个元素L.data[i] = 25 - i; // 元素值从25递减到5L.length++; // 顺序表长度加1}ElemType e; // 用于存储被删除的最小元素的值bool ret = DelMinSqlist(L, e); // 调用函数删除最小元素if(ret) { // 如果删除成功printf("e=%d\n", e); // 打印被删除的元素} else { // 如果删除失败printf("fail\n");}// 打印剩余的顺序表元素,以验证删除操作for(int i = 0; i < L.length; i++) {printf("%d ", L.data[i]);}printf("\n");return 0;
}