题目:
从有序顺序表中删除所有值重复的元素,使表中所有元素的值均不同。
伪代码:
文字思想:
例子:1,2,2,2,3,3,4——》1,2,3,4
1)因为顺序表有序,则值相同的元素必定连续出现
2)设置i从1开始遍历到L.length-1,k初始为1,若L.data[i] != L.data[i-1],L.data[k] = L.data[i];k += 1;
3)遍历到最后k所指元素后面都是重复元素,L.length = k
具体实现:
# include <iostream>
using namespace std;
# define MaxSize 20
typedef int ElemType;
typedef struct {
ElemType data[MaxSize];
int length;
}SqList;
bool delSameValue(SqList &L) {
if (L.length <= 1) {
return false;
} else {
int k = 1,i;
for (i = 1;i < L.length;i++) {
if (L.data[i] != L.data[i-1]) {
L.data[k] = L.data[i];
k += 1;
}
}
L.length = k;
return true;
}
}
int main() {
SqList L;
L.length = 0;
ElemType dtypes[] = {1,2,2,2,3,3,4,5,5,6};
int i,len = sizeof(dtypes)/sizeof(ElemType);
for (i = 0;i < len;i++) {
L.data[i] = dtypes[i];
L.length += 1;
}
if (delSameValue(L)) {
for (i = 0;i < L.length;i++) {
cout << L.data[i] << ", ";
}
}
return 0;
}
效果图:

参考答案:
文字思想:
1)将表划分为A表、B表;A表是该有序顺序表的前半部分,B表是该表的后半部分
2)初始时,表A中只有一个元素,也就是有序顺序表的第一个元素,表B拥有剩下的n-1个元素;
3)用表A的最后一个元素与表B从头开始比较,出现了不相等时,追加到表A尾巴上
4)重复3)直到表B为空,再修改新表长为表A的长度(重复时表B接着上次比较的位置继续就行)
bool delSame(SqList &L) {
// 表空,不存在,删除
if (L.length == 0) {
return false;
}
// 在表A,B中进行索引的指针
int indexA,indexB;
for (indexA = 0,indexB = 1;indexB < L.length;indexB++) {
if (L.data[indexA] != L.data[indexB]) {
L.data[++indexA] = L.data[indexB];
}
}
// 最终表长为表A的长度
L.length = indexA + 1;
return true;
}
实现效果是一样的。
该博客探讨如何从有序顺序表中删除重复元素,确保所有元素值唯一。通过伪代码和具体实现展示算法过程,并提供了实现效果的展示。
951

被折叠的 条评论
为什么被折叠?



