数据结构每日一题day4(顺序表)★★★★★
题目描述:删除顺序表L中第i个位置的元素,若i的输入不合法,则返回 false; 否则将被删元素赋给引用变量e,并将第i+1个元素及其后的所有元素依次往前移动一个位置,返回 true。
算法思想:删除顺序表L中第i个位置的元素的步骤如下:
合法性检查:若顺序表为空、指针为空或位置i不在有效范围(1 ≤ i ≤ length)内,返回false。
保存被删元素:将第i个元素(对应数组下标i-1)的值赋给引用变量e。
元素前移:将第i+1到表尾的所有元素依次前移一位,覆盖被删元素的位置。
更新表长:顺序表长度减1,返回true。
复杂度分析:时间复杂度O(n)空间复杂度O(1)
代码实现:
#include <stdbool.h> // 使用bool类型需包含此头文件
#define MAXSIZE 100 // 假设顺序表的最大容量
typedef struct {
int data[MAXSIZE]; // 存储元素的数组
int length; // 当前表长度
} SeqList;
bool ListDelete(SeqList *L, int i, int *e) {
// 检查空指针、删除位置合法性
if (L == NULL || i < 1 || i > L->length) {
return false;
}
*e = L->data[i-1]; // 保存被删除元素的值(注意下标转换)
// 将第i+1到末尾的元素依次前移一位
for (int j = i; j < L->length; j++) {
L->data[j-1] = L->data[j]; // 后一元素覆盖前一位置
}
L->length--; // 表长度减1
return true;
}