1. 程式人生 > >順序表中的三種刪除重複元素的思想

順序表中的三種刪除重複元素的思想

刪除順序表中的相同元素的三種思想,下面歸納為三個名稱,以方便記憶:

定位賦值法、判斷回退法、雙端判別交換法

圖解如下:

完整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;
}