順序表中的三種刪除重複元素的思想
阿新 • • 發佈:2018-12-13
刪除順序表中的相同元素的三種思想,下面歸納為三個名稱,以方便記憶:
定位賦值法、判斷回退法、雙端判別交換法
圖解如下:
完整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; }