题目描述:从顺序表L中删除最小值元素并由函数返回被删元素的值。(假设顺序表L有最小值且最小值唯一)
算法思想:
合法性检查:若顺序表为空或指针为空,返回特定错误值(如-1,根据题目假设可省略)。
查找最小值位置:遍历顺序表,记录当前最小值及其下标。
保存并删除元素:将最小值元素保存后,将其后所有元素前移一位覆盖该位置。
更新表长:顺序表长度减1,返回被删元素值。
复杂度分析:时间复杂度O(n)空间复杂度O(1)
代码实现:
cpp
#include <stdio.h>
#define MAXSIZE 100 // 假设顺序表最大容量
typedef struct {
int data[MAXSIZE];
int length;
} SeqList;
int DeleteMin(SeqList *L) {
// 检查空指针或空表(题目假设存在最小值,此检查可省略)
if (L == NULL || L->length == 0) {
return -1; // 返回错误标记
}
int min_index = 0; // 初始假设第0个元素最小
int min_value = L->data[0]; // 保存当前最小值
// 遍历查找最小值位置
for (int i = 1; i < L->length; i++) {
if (L->data[i] < min_value) {
min_value = L->data[i];
min_index = i;
}
}
// 将最小值后的元素前移,覆盖删除位置
for (int i = min_index + 1; i < L->length; i++) {
L->data[i - 1] = L->data[i];
}
L->length--; // 表长减1
return min_value; // 返回被删除的最小值
}
int main() {
// 示例测试
SeqList L = {{5, 3, 2, 8, 1}, 5};
int min = DeleteMin(&L);
printf("被删除的最小值:%d\n", min); // 输出:1
printf("删除后的顺序表:");
for (int i = 0; i < L.length; i++) {
printf("%d ", L.data[i]); // 输出:5 3 2 8
}
return 0;
}