(2021)从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位置由最后一个元素填补,若顺序表为空则显示出错信息并退出运行。
1.定义顺序表(静态分配)
#define MaxSize 50
typedef struct{
int data[MaxSize];
int length;
}SqList;
2.初始化顺序表
C语言中会直接将&视为取地址符号,不能使用&传引用。两种方法解决报错:
1.将.c文件后缀改为.cpp,C++中可以允许使用。
2.使用指针传引用,在主函数中传入地址。
此代码中使用第2个方法解决。C语言中的sizeof()函数使用指针时不能正确计算顺序表长度,所以直接计算顺序表长度。有其他计算方法欢迎讨论指导。
void InitList(SqList *L){
for (int i=0,j=1; i<10; i++,j++){
L->data[i] = j;
L->length++;
}
}
3.在main函数中传入地址
在main()函数中先将length初始化为0,后传入表L地址调用InitList()函数。按顺序输出表中个元素的值和表长length。
int main(){
SqList L;
L.length = 0;
InitList(&L);
for(int i=0; i<L.length; i++){
printf("data[%d]=%d\n",i,L.data[i]);
}
printf("length = %d\n",L.length);
return 0;
}
4.删除最小值元素并由函数返回被删元素的值
C++编译可使用bool函数返回true或false,C语言中没有bool类型,此处以0和1代替。
题目还要求返回被删元素的值,由于函数不能同时有两个返回值,所以此处使用引用传参代替返回值。
int DelMinNum(SqList *L,int *min){
if (L->length == 0){
return 0;
}
min = L->data[0];
int pos = 0;
for(int i=1; i<L->length; i++){
if(min>L->data[i]){
min = L->data[i];
pos = i;
}
}
int j = L->length-1;
L->data[pos] = L->data[j];
L->length--;
return 1;
}
5.整体代码以及运行结果
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 50
typedef struct{
int data[MaxSize];
int length;
}SqList;
void InitList(SqList *L){
for (int i=0,j=1; i<10; i++,j++){
L->data[i] = j;
L->length++;
}
}
int DelMinNum(SqList *L,int *min){
if (L->length == 0){
return 0;
}
min = L->data[0];
int pos = 0;
for(int i=1; i<L->length; i++){
if(min>L->data[i]){
min = L->data[i];
pos = i;
}
}
int j = L->length-1;
L->data[pos] = L->data[j];
L->length--;
return 1;
}
int main(){
SqList L;
L.length = 0;
InitList(&L);
for(int i=0; i<L.length; i++){
printf("data[%d]=%d\n",i,L.data[i]);
}
printf("length = %d\n",L.length);
int min = 0;
int val = DelMinNum(&L,&min);
if(val == 0){
printf("表空\n");
}
else{
for(int i=0; i<L.length; i++){
printf("data[%d]=%d\n",i,L.data[i]);
}
printf("length = %d",L.length);
}
return 0;
}