有序表的合并

题目描述:已知两个有序集合A和B,数据元素按值非递减有序排列,现要求一个新的集合C=A\cupB,使集合C中的数据元素仍按值非递减有序排列

例如,设:

                    A=(3,5,8,11)

               B=(2,6,8,9,11,15,20)

则:

            C=(2,3,5,6,8,8,9,11,11,15,20)

1.顺序有序表的合并
(1)算法模块
void MergeList_Sq(SqList &La,SqList &Lb,SqList &Lc){
	Lc.length=La.length+Lb.length;//新表长为待合并两表的长度之和
	Lc.elem=new ElemType[Lc.length];//为合并后的新表分配一个数组空间
    pc=Lc.elem;//指针pc指向新表的第一个元素
	pa=La.elem;//指针pa指向La表的第一个元素
	pb=Lb.elem;//指针pb指向Lb表的第一个元素
	pa_last=La.elem+La.length-1;//指针pa_last指向La表的最后一个元素
	pb_last=Lb.elem+Lb.length-1;//指针pb_last指向Lb表的最后一个元素
	while((pa<=pa_last)&&(pb<=pb_last)){//当指针pa和pb都未达到表La和表Lb的表尾
		if(*pa<=*pb){//依次摘取最小值插入表Lc的最后
			*pc=*pa;
			pc++;
			pa++;
		}
		else{
			*pc=*pb;
			pa++;
			pb++;
		}
	}
	while(pa<=pa_last){//已达到Lb的表尾,依次将La的剩余元素插入Lc的最后
		*pc=*pa;
		pc++;
		pa++;
	}
	while(pb<=pb_last){//已达到La的表尾,依次将Lb的剩余元素插入Lc的最后
		*pc=*pb;
		pa++;
		pb++;
	}
}
(2)程序代码:
#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define MAXSIZE 1000
typedef int Status;
typedef int ElemType;
typedef struct{
	ElemType *elem;
	int length;
}SqList;
Status InitList(SqList &L){
	L.elem=new ElemType[MAXSIZE];
	if(L.elem==NULL) return ERROR;
	L.length=0;
	return OK;
}
void Create_L(SqList &L,int n){
	for(int i=0;i<n;i++){
		scanf("%d",&L.elem[i]);
		L.length++;
	}
}
void MergeList_Sq(SqList La,SqList Lb,SqList &Lc){
	int *pa,*pb,*pc,*pa_last,*pb_last;
	Lc.length=La.length+Lb.length;//新表长为待合并两表的长度之和
	Lc.elem=new ElemType[Lc.length];//为合并后的新表分配一个数组空间
	pa=La.elem;//指针pa指向La表的第一个元素
	pb=Lb.elem;//指针pb指向Lb表的第一个元素
	pc=Lc.elem;//指针pc指向新表的第一个元素
	pa_last=La.elem+La.length-1;//指针pa_last指向La表的最后一个元素
	pb_last=Lb.elem+Lb.length-1;//指针pb_last指向Lb表的最后一个元素
	while(pa<=pa_last&&pb<=pb_last){//当指针pa和pb都未达到表La和表Lb的表尾
		if(*pa<=*pb)//依次摘取最小值插入表Lc的最后
			*pc++=*pa++;
		else
			*pc++=*pb++;
		}
	while(pa<=pa_last)//已达到Lb的表尾,依次将La的剩余元素插入Lc的最后
		*pc++=*pa++;
	while(pb<=pb_last)//已达到La的表尾,依次将Lb的剩余元素插入Lc的最后
		*pc++=*pb++;
}
void TraverseList(SqList L){//遍历线性表中的每一个元素并输出
	for(int i=0;i<L.length;i++)
		printf("%d ",L.elem[i]);
}
int main(){
	SqList La,Lb,Lc;
	if(InitList(La)==0)
	cout<<"内存不足!";
	else{
		int n=4;
		cout<<"请输入表La的元素:";
		Create_L(La,n);
	}
	if(InitList(Lb)==0)
	cout<<"内存不足!";
	else{
		int n1=7;
		cout<<"请输入表Lb的元素:";
		Create_L(Lb,n1);
	}
	MergeList_Sq(La,Lb,Lc);
	cout<<"表Lc的元素为:";
	TraverseList(Lc);
	return 0;
}
(3)运行结果:

2.链式有序表的合并
(1)算法模块:
void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc){
	pa=La->next;//pa指向表La的首元节点
	pb=Lb->next;//pb指向表Lb的首元节点
	Lc=La;//用La的头节点作为Lc的头节点
	pc=Lc;//pc指向Lc的头节点
	while(pa&&pb){//当pa和pb都不为空时
		if(pa->data<=pb->data){//当pa的值域小于pb的值域时
			pc->next=pa;//摘取最小值连接到pc所指节点的后面
			pc=pa;
			pa=pa->next;
		}
		else{//当pa的值域大于pb的值域时
			pc->next=pb;//摘取最小值连接到pc所指节点的后面
			pc=pb;
			pb=pb->next;
		}
	}
	if(pa==NULL)
		pc->next=pb;//将表Lb剩余的节点连接到pc所指节点后
	else
		pc->next=pa;//将表La剩余的节点连接到pc所指节点后
	delete Lb;//释放掉Lb的头节点
}
(2)程序代码:
#include<iostream>
using namespace std;
typedef struct LNode{
	int data;
	struct LNode *next;
}*LinkList,LNode;
void CreateList_H(LinkList &L,int n){//后插法
	L=new LNode;
	L->next=NULL;
    LNode *q,*p;
    q=L;
	for(int i=0;i<n;i++){
		p=new LNode;
		p->next=NULL;
		cin>>p->data;
		q->next=p;
		q=p;
	}
}
void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc){
	LNode *pa,*pb,*pc;
	pa=La->next;//pa指向表La的首元节点
	pb=Lb->next;//pb指向表Lb的首元节点
	Lc=La;//用La的头节点作为Lc的头节点
	pc=Lc;//pc指向Lc的头节点
	while(pa&&pb){//当pa和pb都不为空时
		if(pa->data<=pb->data){//当pa的值域小于pb的值域时
			pc->next=pa;//摘取最小值连接到pc所指节点的后面
			pc=pa;
			pa=pa->next;
		}
		else{//当pa的值域大于pb的值域时
			pc->next=pb;//摘取最小值连接到pc所指节点的后面
			pc=pb;
			pb=pb->next;
		}
	}
	if(pa==NULL)
		pc->next=pb;//将表Lb剩余的节点连接到pc所指节点后
	else
		pc->next=pa;//将表La剩余的节点连接到pc所指节点后
	delete Lb;
}
void TraverseList(LinkList L){//遍历输出链表中的元素
	LNode *p;
	p=L;
	while(p->next!=NULL){
		p=p->next;
		cout<<p->data;
		cout<<" ";
	}
}
int main(){
	LinkList La;
	LinkList Lb;
	LinkList Lc;
	int n=4;
	cout<<"请输入链表La:";
	CreateList_H(La,n);
	int n1=7;
	cout<<"请输入链表Lb:";
	CreateList_H(Lb,n1);
	MergeList_L(La,Lb,Lc);
	cout<<"链表Lc的值为:";
	TraverseList(Lc);
	return 0;
}
(3)运行结果:

以上代码模块在我的电脑上都可以运行成功,但是可能会有小瑕疵,欢迎各位友友指出,如果有不理解的地方,可以评论或者私信我,非常感谢!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乱码怪才

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值