数据结构每日一题day8(顺序表)★★★★★

时间:2025-04-04 19:46:38

题目描述:从有序顺序表中删除所有其值重复的元素,使其中所有元素的值均不同

算法思想:

输入检查:若顺序表为空或指针为空,返回false。

双指针覆盖法:

使用指针k标记保留元素的末尾,初始位置为0。

遍历顺序表(从i=1开始),若当前元素data[i]不等于data[k],则将其保留到k+1位置,并更新k。

更新表长:遍历结束后,表长设为k+1,直接截断后续元素。

复杂度分析:时间复杂度O(n)空间复杂度O(1)

代码实现:

#include <stdbool.h>
#define MAXSIZE 100  // 假设顺序表最大容量

typedef struct {
    int data[MAXSIZE];
    int length;
} SeqList;

bool DeleteDuplicates(SeqList *L) {
    // 检查空指针或空表
    if (L == NULL || L->length == 0) {
        return false;
    }

    int k = 0;  // 保留元素的末尾索引
    for (int i = 1; i < L->length; i++) {
        // 若当前元素与前一个保留元素不同,则保留
        if (L->data[i] != L->data[k]) {
            L->data[++k] = L->data[i];  // 先递增k,再赋值
        }
    }

    L->length = k + 1;  // 新表长为k+1
    return true;
}