顺序表中的三种删除重复元素的思想

版权声明:作者:weizu_cool https://blog.csdn.net/qq_26460841/article/details/82918791

删除顺序表中的相同元素的三种思想,下面归纳为三个名称,以方便记忆:

定位赋值法、判断回退法、双端判别交换法

图解如下:

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

 

猜你喜欢

转载自blog.csdn.net/qq_26460841/article/details/82918791