题目:移除线性表中的所有重复元素;不要使用额外的数组空间,在使用 O(1) 额外空间的条件下完成。
typedef int DataType;
struct seqList
{
int MAXNUM; // 能存放的最大元素个数
int curNum; // 数据元素的个数
DataType *element;
};
typedef struct seqList *PseqList;
实现的两种思路
void delDuplicate_seq(PseqList L){
for(int i=0;i<L->curNum;){
int ret=0; // 判断该元素是否为重复值
for(int j=i+1;j<L->curNum;){
if(L->element[j]==L->element[i]){
deletePos_seq(L,j); // 对位置在下标 i 之后的 进行删除。 如果进行了删除,就不用 j++,因为下面的元素已经移到刚才的位置上了。
ret=1; // 标记 位置 i上的元素是重复元素
}else{
j++;
}
}
if(ret){
deletePos_seq(L,i); // 删除下标为 i的元素 本身。
}else{
i++;
}
}
}
void delDuplicate_seq(PseqList L){
for(int i=0;i<L->curNum;){
int ret=1;
for(int j=i+1;j<L->curNum;j++){
if(L->element[j]==L->element[i]){
delete_seq(L,L->element[i]); // 删除所有值为 element[i]的元素
ret=0;
break;
}
}
if(ret){
i++; // 如果 位置 i上的元素不是重复值,则跳到下一个index。如果是重复值,则不用跳到下一索引,因为删除操作会自动移位。
}
}
}
附调用的函数:
int delete_seq(PseqList L,int x)
{ // 删除与x值相同的数据元素,返回删除数据元素的个数
//可以使用之前已完成的操作
int count=0;
while(locate_seq(L,x)>=0){
deletePos_seq(L,locate_seq(L,x));
count++;
}
return count;
}
// 给定值x首次出现的位置,若不存在,则返回-1
int locate_seq(PseqList L,int x){
for(int i=0;i<L->curNum;i++){
if(L->element[i]==x){
return i;
}
}return -1;
}
int deletePos_seq(PseqList L,int pos)
{ // 删除下标pos处的数据元素,若pos非法,则返回-1;否则返回1
if(pos<0||pos>=L->curNum){
return -1;
}
for(int q=pos;q<L->curNum-1;q++){
L->element[q]=L->element[q+1];
}
L->curNum=L->curNum-1;
return 1;
}