顺序表中的三种删除重复元素的思想
删除顺序表中的相同元素的三种思想,下面归纳为三个名称,以方便记忆:
定位赋值法、判断回退法、双端判别交换法
图解如下:
完整de代码如下:
#include<iostream> using namespace std; typedef int ElemType; typedef struct Sqlist{ ElemType *data; int length; }Sqlist; /* 删除顺序表中相同的元素x 【定位赋值法】 */ void del_sameElem_1(Sqlist &L, ElemType value){ //先定位,找元素赋值法 int k=-1; for(int i=0;i<L.length;i++){ if(value!=L.data[i]){ k++; //定位下标 L.data[k] = L.data[i]; } } L.length = k+1;//长度为下标+1 } //【判断回退法】 void del_sameElem_2(Sqlist &L, ElemType value){ //判断条件,记录格数,回退法 int k=0; for(int i=0;i<L.length;i++){ if(L.data[i]==value){ k++; }else{ L.data[i-k] = L.data[i];//回退 } } L.length -= k; //减去回退的个数 } //比较差,不建议采用 【双端判别交换法】 void del_sameElem_3(Sqlist &L, ElemType value){ //双端判断交换法 for(int i=0, j=L.length-1;i<=j;i++,j--){ //先判断右边是否相等 while(L.data[j]==value) j--; //左边等 while(L.data[i]!=value) i++; if(L.data[i]==value){ L.data[i]=L.data[j]; j--; i++; } } } void init(Sqlist &L, int length){ L.data = new int[length];//这里亦可以采用malloc函数来分配空间, 需要引入malloc.h L.length = 20; } void pushElem(Sqlist &L){ for(int i=0;i<L.length;i++){ if(i%3==0){ L.data[i] = 2; }else if(i%3==1){ L.data[i] = 3; }else if(i%3==2){ L.data[i] = 5; } } } void printList(Sqlist L){ for(int i=0;i<L.length;i++){ cout<<L.data[i]<<" "; } } int main(void){ Sqlist L; init(L, 20);//初始化 pushElem(L); cout<<"Original Data Sequence"<<endl; printList(L); cout<<endl; cout<<"Do something Data Sequence"<<endl; del_sameElem_3(L, 3); printList(L); return 0; }