题目描述:对长度为n的顺序表L,删除顺序表中所有值为x的数据元素。
算法思想:
双指针覆盖法:使用两个指针(逻辑上的索引),一个遍历原数组(i),另一个记录保留元素的位置(k)。
筛选保留元素:遍历时,若当前元素不等于x,将其复制到k位置,并递增k。
更新表长:遍历结束后,将顺序表长度设为k,实现原地删除所有x元素。
复杂度分析:时间复杂度O(n)空间复杂度O(1)
代码实现:
cpp
#include <stdbool.h>
#define MAXSIZE 100 // 假设顺序表最大容量
typedef struct {
int data[MAXSIZE];
int length;
} SeqList;
bool DeleteAllX(SeqList *L, int x) {
// 检查空指针
if (L == NULL) {
return false;
}
int k = 0; // 记录保留元素的位置
for (int i = 0; i < L->length; i++) {
// 若当前元素不等于x,保留到位置k
if (L->data[i] != x) {
L->data[k++] = L->data[i];
}
}
L->length = k; // 更新表长为保留元素的数量
return true;
}