顺序表中删除一个具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位置由最后一个元素填补,若顺序表为空则显示出错信息并退出运行。
算法思想:搜索整个顺序表,查找最小值并记住其位置,搜索结束后用最后一个元素填补空出的最小值元素的位置
碎碎念:
大概的思路跟参考算法差不多,就是第一次实现题目想写一个完整的程序,但其实只需要写个函数就行,但是这样的话我没办法保证自己的代码是正确的,只能说算法思想是一样的。
我的代码:
函数部分:(代码思路没什么问题,但运行会报错!)
int DelMin(SqList &L) { //删除最小元素
int j, min = L.data[0], mini=0;
if (L.length != 0) {
for (j =1; j < L.length; j++) {
if (L.data[j] < min) {
min = L.data[j];
mini = j;
}
}
L.data[mini] = L.data[L.length-1];
L.length--; //***这里需要把顺序表长度减一***
return min; //返回最小元素
}
else
return 0;
}
整体代码:
#include <stdlib.h>
#include<stdio.h>
#include<stdlib.h>
#define InitSize 10
typedef struct { //动态分配定义线性表
int* data;
int MaxSize, length;
}SqList;
void InitList(SqList& L) { //初始化顺序表
L.data = (int*)malloc(InitSize * sizeof(int)); //用malloc函数申请一片连续的存储空间
L.length = L.MaxSize;
L.MaxSize = InitSize;
}
int DelMin(SqList &L) { //删除最小元素
int j, min = L.data[0], mini=0;
if (L.length != 0) {
for (j =1; j < L.length; j++) {
if (L.data[j] < min) {
min = L.data[j];
mini = j;
}
}
L.data[mini] = L.data[L.length-1];
L.length--; //***这里需要把顺序表长度减一***
return min; //返回最小元素
}
else
return 0;
}
int main() {
SqList L;
int i, ans;
InitList(L);
int* p = L.data;
printf("顺序表为:");
for (i = 0; i < L.length; i++) {
L.data[i] = rand() % 51;
printf("%d ", L.data[i]);
}
printf("\n");
ans = DelMin(L);
if (ans == 0) {
printf("错误!顺序表为空!"); //输出报错信息
}
else {
printf("删除%d,现顺序表为:",ans);
for (i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
}
free(p);
return 0;
}