Bootstrap

线性表——删除重复元素

题目:移除线性表中的所有重复元素;不要使用额外的数组空间,在使用 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;
}

在这里插入图片描述

;