数据结构——有序顺序表的合并

以下是数据结构中关于有序顺序表的合并的基础操作(编程风格参考严蔚敏版数据结构)。

头文件及宏

#include
#include
using namespace std;
#define ElemType int
#define MAXSIZE 20

说明:ElemType 定义为int的目的是方便以后同意我们所需定义的元素的类型,比如如果以后想把结构体内的元素类型改为char,只需要在ElemType 这里宏定义为char即可(当然,编程的过程中关于元素的类型也要写ElemType)

定义顺序表

typedef struct SqList{
	ElemType *elem;
	int length;
}Sqlist,*Sl; 

初始化

void initial(Sqlist &L){
	L.elem = new ElemType[MAXSIZE];
	L.length = 0;
}

特别注意:这里传进来的是一个实体,如果传进来的是指针,要先给指针开辟内存空间:L = new Sqlist;

合并过程

void merge(Sqlist &L3,Sqlist &L1,Sqlist &L2){
	ElemType *L1_last;
	ElemType *L2_last;
	ElemType *p1,*p2,*p3;
//*********以上是书本代码省略的部分*******// 
	L3.length = L1.length + L2.length;//L3的长度是L1的长度+L2的长度
	L3.elem = new ElemType[L3.length];//为L3的元素数组开辟空间
	p1 = L1.elem;//p1指向L1的元素数组
	p2 = L2.elem;//p2指向L2的元素数组
	p3 = L3.elem;//p3指向L3的元素数组
	L1_last = L1.elem+L1.length-1;//标记L1元素数组的末尾
	L2_last = L2.elem+L2.length-1;//标记L2元素数组的末尾
	while(p1<=L1_last&&p2<=L2_last){//当有顺序表添加完毕后就跳出 
		if(*p1<*p2){//如果当前L1元素数组的值大于
			*(p3)++=*(p1)++; 
			//将小的值填入L3,然后指针两个指针均往下移动一个位置;
		}else{
			*p3++=*p2++; //上一行是其完整写法 
		}
	}
	while(p1<=L1_last)*p3++=*p1++;//如果L1有元素剩余,将剩下的元素填入L3中 
	while(p2<=L2_last)*p3++=*p2++;//如果L2有元素剩余,剩下的元素填入L3中 
}

说明:书本上的代码是简写,关于声明的部分猜测是因为篇幅并没有写出来,这让很多初学的小白照着书本的代码敲发现运行不了,缺这个缺那个。当然这个只是我自己的理解补充完整的代码,不一定对,补充方式也绝不唯一。

步骤:
1、创建三个指针p1 p2 p3,分别指向L1、L2、L3的elem开头(elem其实是一个数组);
2、创建两个指针L1_last L2_last,分别指向L1、L2的elem的末尾(用来标记p1 或者 p2走到其对应的elem末尾);
3、将p1 p2放入while循环,不管哪个先到末尾(即地址与last相等)都跳出该循环;
4、在循环中,将p1和p2对应的值相对较小的那一个值赋给p3对应的位置的值,然后相关的指针往下移动一个位置(如果使用的是p1的值就移动p1和p3,如果使用的是p2的值就移动p2和p3);
5、循环跳出后将剩余的元素全部装入L3。

注意:*p3++=*p2++语义:将p2指向的地址的值取出来,赋给p3指向的地址的值,然后两个指针同时往下移动一个位置。

完整源代码:

/*
		广西师范大学 计算机科学与工程学院 
		GuangXi Normal University College of Computer Science and Engineering  
		Student STZ 
*/ 
#include
#include
#include 
#include 
using namespace std;
#define ElemType int
#define MAXSIZE 20

typedef struct SqList{
	ElemType *elem;
	int length;
}Sqlist,*Sl; 

void showList(Sqlist &L){
	for(int i=0;i<L.length;i++){
		cout<<L.elem[i]<<" ";
	}
	cout<<endl;
}

void initial(Sqlist &L){
	L.elem = new ElemType[MAXSIZE];
	L.length = 0;
}
//
void merge(Sqlist &L3,Sqlist &L1,Sqlist &L2){
	ElemType *L1_last;
	ElemType *L2_last;
	ElemType *p1,*p2,*p3;
//*********以上是书本代码省略的部分*******// 
	L3.length = L1.length + L2.length;
	L3.elem = new ElemType[L3.length];
	p1 = L1.elem;
	p2 = L2.elem;
	p3 = L3.elem;
	L1_last = L1.elem+L1.length-1;
	L2_last = L2.elem+L2.length-1;
	while(p1<=L1_last&&p2<=L2_last){//当有顺序表添加完毕后就跳出 
		if(*p1<*p2){
			*(p3)++=*(p1)++; //下一行是其简要写法 
		}else{
			*p3++=*p2++; //上一行是其完整写法 
		}
	}
	while(p1<=L1_last)*p3++=*p1++;//如果L1有元素剩余,将省下的元素填入L3中 
	while(p2<=L2_last)*p3++=*p2++;//如果L2有元素剩余,省下的元素填入L3中 
}

int main(){
	SqList List1;
	Sqlist List2;
	initial(List1);
	initial(List2);
	List1.elem[0]=1;List1.elem[1]=3;List1.elem[2]=4;List1.elem[3]=5;List1.elem[4]=7;
	List1.length = 5;
	List2.elem[0]=2;List2.elem[1]=3;List2.elem[2]=5;List2.elem[3]=6;
	List2.length = 4;
	showList(List1);
	showList(List2);
	Sqlist List3;
	merge(List3,List1,List2);
	showList(List3);
	return 0;
} 

说明:为了方便,偷了个懒直接写死两个顺序表的值。

运行结果

数据结构——有序顺序表的合并_第1张图片

你可能感兴趣的:(数据结构,数据结构,c++,算法,c语言,开发语言)