题目描述:已知两个有序集合A和B,数据元素按值非递减有序排列,现要求一个新的集合C=AB,使集合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)运行结果:
以上代码模块在我的电脑上都可以运行成功,但是可能会有小瑕疵,欢迎各位友友指出,如果有不理解的地方,可以评论或者私信我,非常感谢!!