数据结构练习题---合并表 (顺序表)

61 篇文章 0 订阅
26 篇文章 0 订阅

描述

已知va和vb分别为非递减有序线性表,将va和vb进行合并为新的线性表vc,并保持vc仍然非递减有序。

本题中,线性表元素为整数。线性表的最大长度为1000。

输入

输入数据有多组,第一行为测试数据的组数n,接下来为2n行,每一组测试数据有两行:


第一行的第一个数为va的元素个数,后面是n个整数,代表va的所有元素


第二行的第一个数为vb的元素个数,后面是n个整数,代表vb的所有元素

输出

输出合并后的长度以及vc的所有元素

样例输入

2
2 1 2
2 2 3
3 1 2 3
3 4 5 6

样例输出

4 1 2 2 3
6 1 2 3 4 5 6
#include<iostream>
#include<stdlib.h>
#define MI 10
#define MX 20
using namespace std;
 struct list
{
    int *data;
    int length;
    int listsize;
};
int Inlist(list &l)
{
    l.data=(int *)malloc(MI*sizeof(int));
    if(!l.data)return 0;
    l.length=0;
    l.listsize=MI;
    return 1;
}
int creata(list &l)
{
    int n;
    cin>>n;
    l.data[l.length++]=n;
    if(l.length>=l.listsize)
    {
        l.data=(int *)realloc(l.data,(l.listsize+MX)*(sizeof(int)));
        if(!l.data)return 0;
        l.listsize+=MX;
    }
    return 1;
}
int Xulist(list l,int i,int &e)
{
    if(i<1||i>l.length)return 0;
    e=l.data[i-1];
    return 1;
}
int merge_list(list la,list lb,list &lc)
{
    int i=1,j=1,ai,aj;
    while(i<=la.length&&j<=lb.length){
    Xulist(la,i,ai);Xulist(lb,j,aj);
    if(ai<=aj){
        lc.data[lc.length++]=ai;i++;
        if(lc.length>=lc.listsize){
            lc.data=(int *)realloc(lc.data,(lc.listsize+MX)*(sizeof(int)));
            if(!lc.data)return 0;
            lc.listsize+=MX;
        }
    }
    else{
        lc.data[lc.length++]=aj;j++;
        if(lc.length>=lc.listsize){
        lc.data=(int *)realloc(lc.data,(lc.listsize+MX)*(sizeof(int)));
            if(!lc.data)return 0;
            lc.listsize+=MX;
        }
    }
   }
   while(i<=la.length)
   {
       Xulist(la,i++,ai);
       lc.data[lc.length++]=ai;
        if(lc.length>=lc.listsize){
        lc.data=(int *)realloc(lc.data,(lc.listsize+MX)*(sizeof(int)));
            if(!lc.data)return 0;
            lc.listsize+=MX;
        }
   }
   while(j<=lb.length)
   {
        Xulist(lb,j++,aj);
        lc.data[lc.length++]=aj;
        if(lc.length>=lc.listsize){
        lc.data=(int *)realloc(lc.data,(lc.listsize+MX)*(sizeof(int)));
            if(!lc.data)return 0;
            lc.listsize+=MX;
        }
   }
   return 1;
}
int main()
{
    int n;
    list la,lb,lc;
    cin>>n;
    while(n--)
    {
         int a,b,i,ch;
         cin>>a;
         Inlist(la);
         Inlist(lb);
         Inlist(lc);
         for(i=0;i<a;i++)
          creata(la);
         cin>>b;
         for(i=0;i<b;i++)
           creata(lb);
        merge_list(la,lb,lc);
        cout<<a+b<<" ";
        for(i=0;i<lc.length-1;i++)
            cout<<lc.data[i]<<" ";
        cout<<lc.data[i]<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值