题目链接
戳我
题目形容
从程序表L中删除具备最小值的元素(假如惟一)并友函数返回被删元素的值。空出的元素由最初一个元素填补。
输出
输出蕴含一个整数n代表程序表L长度。
接下来蕴含n个整数,代表程序表L中的元素。
输入
若程序表为空,输入 “error”.
若不为空,输入最小元素的值并输入删除最小值之后的程序表。
样例输出
3
1 2 3
样例输入
1
3 2
留神点
这里要留神审题,删除最小元素,并把最初一个元素放到删除元素的地位上,
并不需要删除元素后,挪动后续元素。
C++参考解答
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 50
typedef int ElemType;
typedef struct {
ElemType data[MAXSIZE];
int length;
}SqList;
//初始化程序表
void InitList(SqList& L) {
L.length =0;
memset(L.data, 0, sizeof(ElemType));
}
//打印程序表
void PrintList(SqList L) {
int i;
for (i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
printf("\n");
}
//删除程序表元素
bool ListDelete(SqList& L, int i) {
if (i<0 || i>L.length) {
return false;
}
if (L.length == 0) {
return false;
}
//不须要挪动元素
//int j;
/*for(j=i;j<L.length-2;j++){
L.data[j] = L.data[j+1];
}*/
L.data[i - 1] = L.data[L.length - 1];
L.length--;
return true;
}
//求程序表中最小的元素
ElemType ListMin(SqList L) {
int x = L.data[0]; int i;
for (i = 1; i < L.length; i++) {
if (L.data[i] < x) {
x = L.data[i];
}
}
return x;
}
//求出程序表中最小元素的地位
int MinPos(SqList L,int x) {
int i;
for (i = 0; i < L.length; i++) {
if (L.data[i] == x) {
return i + 1;
}
}
}
int main() {
SqList L;int i,n;
ElemType x,min;
InitList(L);
scanf("%d", &n);
L.length = n;
for (i = 0; i < L.length; i++) {
scanf("%d", &L.data[i]);
}
min = ListMin(L);
ListDelete(L, MinPos(L,min));
if (L.length == 0) {
printf("error\n");
}else {
printf("%d\n", min);
PrintList(L);
}
return 0;
}
发表回复