题目描述
已知两非递减的顺序线性表,要求合并成一个新的非递减顺序线性表。(测试数据为整型)
输入
输入包含四行,第一行为自然数n,表示第一个非递减顺序线性表的长度;
第二行为n个自然数构成的非递减顺序线性表;
第三行为自然数m,表示第二个非递减顺序线性表的长度;
第四行为m个自然数构成的非递减顺序线性表。
输出
输出:用一行输出合并后的非递减顺序线性表,各数之间用一个空格隔开。
样例输入
2
1 3
3
2 3 6
样例输出
1 2 3 3 6
#include<stdio.h>
#define MaxSize 50
#include<malloc.h>
typedef struct//线性表
{
int data[MaxSize];
int length;
}Sqlist;
void init(Sqlist*&L)//初始化
{
L=(Sqlist*)malloc(sizeof(Sqlist));
L->length=0;
}
void Insert(Sqlist*&L,int num)
//插入数据后长度增一,这里长度就是新增数据应插入的位置
{
L->data[L->length]=num;
L->length++;
}
void Add(Sqlist *L1,Sqlist *L2,Sqlist *L3)
{
int i=0,j=0;//L1,L2的L->data[]数组的下表,初始化为0
while(i<L1->length&&j<L2->length)//两个表都没有到底,则继续
{
if(L1->data[i]>L2->data[j])
//若L2的数比L1的数小,则把L2的数插入L3中
{
L3->data[L3->length]=L2->data[j];
L3->length++;//L3新增一个元素,长度增一
j++;
}else
if(L1->data[i]<=L2->data[j])、
//若L1的数小于L2的数,则把L1的数插入L3
//这里把两数相等的情况考虑了,若相等,则先提L1的插入L3
{
L3->data[L3->length]=L1->data[i];
L3->length++;//L3新增一个元素,长度增一
i++;
}
}
//循环出来,有一个表到底了,即i==L1->length或j==L2->length,下面两循环只执行一个
while(i<L1->length)
//若L1没有到底,则L1表中剩下的数比L3中所有数大,依次插入到L3末尾
{
L3->data[L3->length]=L1->data[i];
L3->length++;//L3新增一个元素,长度增一
i++;
}
while(j<L2->length)
//若L2没有到底,则L2表中剩下的数比L3中所有数大,依次插入到L3末尾
{
L3->data[L3->length]=L2->data[j];
L3->length++;//L3新增一个元素,长度增一
j++;
}
}
void display(Sqlist*L)
{
for(int k=0;k<L->length;k++)
{
printf("%d ",L->data[k]);
//这样会多输出一个空格,但学校oj判题可以过
//有时符合实际的输出,反而会提示“Presentation Error"
}
}
int main()
{
int n,m,num;
Sqlist *L1,*L2,*L3;//线性表一、二、三,三用来存结果
init(L1);//初始化三个线性表
init(L2);
init(L3);
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&num);
Insert(L1,num);//将输入的数字,一个个插入L1线性表,可以不用数组装数据再建表
}
scanf("%d",&m);
for(int j=0;j<m;j++)
{
scanf("%d",&num);
Insert(L2,num);//将输入的数字,一个个插入L2线性表,可以不用数组装数据再建表
}
Add(L1,L2,L3);//等两个表建立完,就可以把两个表组合到L3中
display(L3);//打印L3
}