941: 有序顺序表的合并操作的实现

题目描述
已知两非递减的顺序线性表,要求合并成一个新的非递减顺序线性表。(测试数据为整型)
输入
输入包含四行,第一行为自然数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
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值