题目:从有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不同
一、核心思想:
①第一个元素不重复,定义i指向第一个顺序表的下标,定义j指向顺序表的第二个元素,j的作用是工作指针,用来遍历顺序表
②当i和j不相同时,需保留j所指向的元素,此时先将i++,再将j指向的元素保存到此时i指向的位置,也即,L->element[i] =L->element[j];
③当i和j相同时, 将j向后移动
④顺序表长度更新,更新顺序表的当前元素个数为不重复元素的数量,也即,L->n = i + 1
bool delete_Same(Seqlist *L) {
if (L->n == 0) return false; // 如果顺序表为空,返回false
int i = 0; // i指向当前处理到的不重复元素的位置 即第一个元素不重复
for (int j = 1; j < L->n; j++) { // 从第二个元素开始遍历
if(L->element[i] != element[j]) { // 将当前元素复制到不重复元素序列的末尾
i++; // 移动不重复元素的索引
L->element[i] = L->element[j]; // 将当前元素复制到不重复元素序列
}
}
L->n = i + 1; // 更新顺序表的当前元素个数为不重复元素的数量
return true; // 返回true表示成功删除重复元素
}
二、可执行代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct seqList {
int n;
int maxLength;
int *element;
} SeqList;
void initSeqList(SeqList *L, int maxLength) {
L->n = 0;
L->maxLength = maxLength;
L->element = (int *)malloc(maxLength * sizeof(int));
if (!L->element) {
exit(-1);
}
}
void insertElem(SeqList *L, int value) {
if (L->n < L->maxLength) {
L->element[L->n++] = value;
}
}
void displaySeqList(SeqList *L) {
printf("顺序表: ");
for (int i = 0; i < L->n; i++) {
printf("%d ", L->element[i]);
}
printf("\n");
}
bool Del_Same(SeqList *L) {
if (L->n == 0) {
return false;
}
int i = 0; // 指向当前检查的元素
for (int j = 1; j < L->n; j++) {
if (L->element[i] != L->element[j]) {
i++;
L->element[i] = L->element[j]; // 移动非重复元素
}
}
L->n = i + 1; // 更新顺序表长度
return true;
}
int main() {
SeqList L;
initSeqList(&L, 10);
insertElem(&L, 1);
insertElem(&L, 2);
insertElem(&L, 2);
insertElem(&L, 3);
insertElem(&L, 4);
insertElem(&L, 4);
insertElem(&L, 5);
displaySeqList(&L);
if (Del_Same(&L)) {
printf("顺序表中的重复元素已被删除。\n");
} else {
printf("顺序表为空,无需删除。\n");
}
displaySeqList(&L);
free(L.element);
return 0;
}