目录
题目描述
从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删除元素的值。空出的位置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。
来源:王道p19.1
解题思路
从前往后遍历,并记录最小值下标,根据题目要求替换成表尾元素,顺序表长度减1。
宏定义
#define SqElemType int
#define MaxSize 1000
顺序表定义
typedef struct{
SqElemType data[MaxSize];
int length;
}SqList;
[注] 上述宏定义和结构体定义是答题时要写的答案,并不是代码实现时的定义,代码实现稍有不同,感兴趣可去“help.h”中查看。
实现函数
SqElemType WD_17_1(SqList *L){ //传入的是L的指针
if(L->length==0) exit(0); //如果顺序表长度为0
int e=0; //定义最小值的下标
for(int i=1;i<L->length;i++){ //下标定义时为0,所以从1开始遍历
if(L->data[e]>L->data[i]) e=i; //记录最小值下标
}
SqElemType res=L->data[e]; //定义返回值,并赋初值为查找到的最小值
L->data[e]=L->data[L->length-1]; //根据题目要求用顺序表最后一位填补删除的元素
L->length--; //顺序表长度减1
return res; //返回结果
}
测试代码
#include"../help.h"
/*
题目:从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删除元素的值。空出的位置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。
出自:王道p19.1
*/
SqElemType WD_17_1(SqList *L){ //传入的是L的指针
if(L->length==0) exit(0); //如果顺序表长度为0
int e=0; //定义最小值的下标
for(int i=1;i<L->length;i++){ //下标定义时为0,所以从1开始遍历
if(L->data[e]>L->data[i]) e=i; //记录最小值下标
}
SqElemType res=L->data[e]; //定义返回值,并赋初值为查找到的最小值
L->data[e]=L->data[L->length-1]; //根据题目要求用顺序表最后一位填补删除的元素
L->length--; //顺序表长度减1
return res; //返回结果
}
//[注] 题目条件是顺序表只有一个最小元素,本测试代码传入的顺序表可能有多个最小值,只会删除第一个
int main(){
for(int i=0;i<3;i++){
printf("\n------------------第%d次测试-----------------\n\n",i+1);
SqList L;
InitsqList(&L);
int len;
int *arr=create_arr_n(30,15,&len);
for(int i=0;i<len;i++) ListInsert(&L,1,arr[i]);
printf("删除前:");
print_sqList(L);
int min=WD_17_1(&L);
printf("\nmin:%d",min);
printf("\n删除后:");
print_sqList(L);
}
}