第二章:顺序表P19
7.将两个有序顺序表合并为一个新的有序顺序表。
思想:首先,按顺序不断取下两个顺序表表头较小的结点存入新的顺序表中。然后,看那个表还有剩余元素,将剩下的部分加到新的顺序表后面。
#include<iostream>
using namespace std;
#define MaxSize 100
#define N 11
#define M 5
typedef struct{
int *data;
int length;
}SqList;
//初始化
void initlist1(SqList &L1) //用引用
{
int nums[N]={1,1,4,5,8,8,8,110,110,220,220};
L1.data = new int[MaxSize]; //后面要delete
for(int i=0;i<N;i++)
{
L1.data[i]=nums[i];
}
L1.length=N;
}
void initlist2(SqList &L2) //用引用
{
int nums[M]={1,2,3,6,7};
L2.data = new int[MaxSize]; //后面要delete
for(int i=0;i<M;i++)
{
L2.data[i]=nums[i];
}
L2.length=M;
}
//合并两个有序顺序表
bool Merge(SqList L1,SqList L2,SqList &L3) //将有序顺序表L1\L2合并为一个新的有序顺序表L3
{
if(L1.length+L2.length>L3.length)
return false;
int i=0,j=0,k=0;
while(i<L1.length&&j<L2.length) //循环两两比较,小者存入结果表
{
if(L1.data[i]<=L2.data[j])
L3.data[k++]=L1.data[i++];
else
L3.data[k++]=L2.data[j++];
}
while(i<L1.length) //剩下的没有比较的数直接存入表尾
L3.data[k++]=L1.data[i++];
while(j<L2.length)
L3.data[k++]=L2.data[j++];
L3.length=k;
return true;
}
//打印输出
void Print_Sq(SqList &L)
{
for(int i=0;i<L.length;i++)
{
cout<<L.data[i]<<" ";
}
cout<<endl;
}
int main()
{
SqList L1,L2,L3;
initlist1(L1);
initlist2(L2);
Print_Sq(L1);
Print_Sq(L2);
Merge(L1,L2,L3);
Print_Sq(L3);
return 0;
}