合并两个有序表(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分,台风即将要来了,也不知道会不会断电断网。白天还好,就怕明晚连灯都没有,连书都看不了。
小陈菜菜,还望评论区指教


版权声明:本文为m0_51456787原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。