线性表合并

 #include <stdio.h>
#include<stdlib.h>
#define OK  1
#define  ERROR 0
#define  TRUE  1
#define OVERFLOW  -2
typedef  int Status;

#define LIST_INIT_SIZE  100
#define LISTINCREMENT  10
typedef   struct
{
    int *elem;
    int length;
    int listsize;
}Sqlist;


Status InitList_Sq(Sqlist  &L)
{
    L.elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));
    if(!L.elem)   return OVERFLOW;
    L.length=0;
    L.listsize=LIST_INIT_SIZE;
    return OK;
}


Status  ListInsert_Sq(Sqlist &L,int i,int e)
{
    int *newbase;
    int *p,*q;
    if(i<1||i>L.length+1)   return ERROR;
    if(L.length>=L.listsize)
    {
        newbase=(int*)malloc((L.listsize+LISTINCREMENT)*sizeof(int));
        if(!newbase)   return OVERFLOW;
        L.elem=newbase;
        L.listsize=L.listsize+LISTINCREMENT;
    }
    q=&(L.elem[i-1]);
    for(p=&(L.elem[L.length-1]);  p>=q;  --p)
    {
        *(p+1)=*p;
    }
    *q=e;
    L.length++;
    return OK;
}

Status MergeList(Sqlist La,Sqlist  Lb,Sqlist &Lc,Status(*ListInsert_Sq)(Sqlist &Lc,int i,int e))
{
    int i,j,k;
    int La_len,Lb_len;
    //InitList_Sq(Lc);
    i=j=0;k=1;
    La_len=La.length;
    Lb_len=Lb.length;
    while(i<La_len||j<Lb_len)
    {
        if(La.elem[i]<=Lb.elem[j])
        {
            ListInsert_Sq(Lc,k++,La.elem[i]);
            i++;
        }
        else
        {
            ListInsert_Sq(Lc,k++,Lb.elem[j]);
            j++;
        }
    }
    while (i<La_len)
    {
        ListInsert_Sq(Lc,k++,La.elem[i]);
        i++;
    }
    while (j<Lb_len)
    {
        ListInsert_Sq(Lc,k++,Lb.elem[j]);
        j++;
    }
    return OK;
}

int main()
{
    Sqlist  La,Lb,Lc;
    int i,j,e;
    int m,n;
    InitList_Sq(La);
    InitList_Sq(Lb);
    InitList_Sq(Lc);
    while (scanf("%d%d",&m,&n)&&(m>0)&&(n>0))
    {
        La.length=m;
        Lb.length=n;
        Lc.length=La.length+Lb.length;
        for(i=1;i<=m;i++)
        {
            scanf("%d",&e);
            ListInsert_Sq(La,i,e);
            //printf("%d\n",La.elem[i]);
        }
        for(i=1;i<=n;i++)
        {
            scanf("%d",&e);
            ListInsert_Sq(Lb,i,e);

        }

        /*for (j=0;j<m;j++)
        {
            printf("%d ",La.elem[j]);
        }
        printf("\n");
        for (j=0;j<n;j++)
        {
            printf("%d ",Lb.elem[j]);
        }
        printf("\n");*/
        MergeList(La,Lb,Lc,ListInsert_Sq);
        for (j=0;j<7;j++)
        {
            printf("%d ",Lc.elem[j]);
        }
        printf("\n");
    }
    return OK;
}


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值