合并两个有序表(C语言)

描述

已知两个严格单调递增的表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分,台风即将要来了,也不知道会不会断电断网。白天还好,就怕明晚连灯都没有,连书都看不了。还望评论区指教


如果这篇文章对你帮助很大,麻烦帮忙,点下友情链接: 鱼儿项目网,进去之后切换几个页面,停留几十秒。感激不尽。里面有一些免费项目大家也可以看看

  • 12
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

m明月Java3

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

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

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

打赏作者

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

抵扣说明:

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

余额充值