栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

头文件及宏
#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指向的地址的值,然后两个指针同时往下移动一个位置。

完整源代码:
 
#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
		cout<
	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;
} 

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

运行结果

暑期编程PK赛 得CSDN机械键盘等精美礼品!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1017497.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号