描述
已知两个严格单调递增的表a(长度为n,n≤10000)和表b(长度为m,m≤10000),其中数据均为正整数,将其合并成一个严格单调递增的表c。
格式
输入格式
输入为3行,第一行两个数n和m,表示序列的长度。第二行是一个长度为n的表a,第三行是长度为m的表b。
输出格式
输出合并后的表c
样例
输入样例
5 6
2 4 7 9 12
3 4 8 9 12 15
输出样例
2 3 4 7 8 9 12 15
题解及详细注释
#include <stdio.h>
#include <stdlib.h>
#define l 10000
//定义顺序表的结构体
typedef struct
{
int elem[l];
int length;
}Sqlist;
//定义read函数,作用:输入顺序表的数值
void read(Sqlist *L)
{
int i=0;
while(i<L->length)
{
scanf("%d",&L->elem[i++]);
}
}
//定义print函数,作用:输出合并后的表
void print(Sqlist *L)
{
int i=0,j=0,n=0;
for(i=0;i<L->length;i++)
{
j=i;
n=j+1;
if(L->elem[j]==L->elem[n])//如果相邻的数值一样,则跳过,即i++,不重复输出相同的数
{
i++;
}
printf("%d ",L->elem[i]);
}
}
//主函数
int main()
{
int i=0,j=0,k=0;
Sqlist L,Q,S;//创建顺序表L,Q,S
scanf("%d%d",&L.length,&Q.length);//这里是主函数,所以是Q.length,而不是Q->length
read(&L);//调用read函数,输入L表的数值
read(&Q);//同上
//合并有序表,比较L表和Q表的数值后,把小的数值赋给S表
while(i<Q.length&&j<L.length)//循环条件是两个表都没有遍历完,某表遍历完,结束循环
{
if(Q.elem[i]<L.elem[j])
{
S.elem[k]=Q.elem[i];
i++;
k++;
}
else
{
S.elem[k]=L.elem[j];
k++;
j++;
}
}
while(j<L.length)//注意循环条件
{
S.elem[k]=L.elem[j++];
k++;
}
while(i<Q.length)//注意循环条件
{
S.elem[k]=Q.elem[i++];
k++;
}
S.length=k;
print(&S);//调用自己定义的print函数,输出合并后的顺序表
}
写于2021年7月20日22:42分,台风即将要来了,也不知道会不会断电断网。白天还好,就怕明晚连灯都没有,连书都看不了。还望评论区指教
如果这篇文章对你帮助很大,麻烦帮忙,点下友情链接: 鱼儿项目网,进去之后切换几个页面,停留几十秒。感激不尽。里面有一些免费项目大家也可以看看