设计思想:
1、对于顺序表B,设B.data[0...j](j的初值为0)无重复元素
2、令i = 1,用参数k控制while循环来检测B.data[i]与B.data[0...j]的元素是否相同;若B.data[i]与B.data[0...j]的元素均不相同,则将B.data[i]存入B.data[0...j]中,即执行B.data[++j] = B.data[i];
3、重复执行for循环,直至算法结束
/*
从一个无序顺序表中删除重复的元素,并使剩余元素间的相对次序保持不变
*/
# include <stdio.h>
typedef int ElemType;
typedef struct {
ElemType data[100];
int length;
}SqList;
int removeSame1(SqList &B) {
int i, j = 0, k;
for (i = 1; i < B.length; ++i) {
k = 0;
while (k <= j && B.data[k] != B.data[i])
k++;
if (k > j) //表示B.data[i]与B.data[0...j]中元素都不相同
B.data[++j] = B.data[i];
}
B.length = j+1;
return B.length;
}
int main() {
SqList R;
int A[] = {1, 2, 2, 1, 3, 4, 5, 4, 2, 1};
int i;
for (i = 0; i < sizeof(A)/4; ++i) //顺序表初始化
R.data[i] = A[i];
R.length = i;
R.length = removeSame1(R); //删除重复元素并返回删除后的表长
printf("删除前:\n");
for (i = 0; i < sizeof(A)/4; ++i)
printf("%2d", A[i]);
printf("\n");
printf("删除后:\n");
for (i = 0; i < R.length; ++i)
printf("%2d", R.data[i]);
printf("\n");
return 0;
}
/*
在Vc++6.0中的输出是:
删除前:
1 2 2 1 3 4 5 4 2 1
删除后:
1 2 3 4 5
*/