顺序表应用5:有序顺序表归并

以上为题目。

归并和链表的归并相通,可相互印证理解、

下面为代码:

#include <stdio.h>
#include <stdlib.h>
#define List_init_size 10000
typedef int Element;


typedef struct
{
    Element *elem;
    int length;
    int listsize;
}Sqlist;

int Initlist(Sqlist *L)//一如既往的初始化初始化顺序表
{
    L->elem=(Element *)malloc(List_init_size*sizeof(Element));
    if(!L->elem)return -1;
    L->length=0;
    L->listsize=List_init_size;
}

int Initlist1(Sqlist *L)//一如既往的初始化顺序表
{//注意新表长度为原来两表长度的两倍,需重新分配储存容量
    L->elem=(Element *)malloc(2*List_init_size*sizeof(Element));
    if(!L->elem)return -1;
    L->length=0;
    L->listsize=List_init_size;
}

void Createlist(Sqlist *L,int m)//输入函数
{
    int i;
    for(i=0;i<m;i++)
    {
        scanf("%d",&L->elem[i]);
    }
    L->length=m;
}

int Listinsert(Sqlist *L,int k,int e)
{//将元素e插入到第k个元素之前
    if(k<1||k>L->length+1)return -1;//判断插入位置的合法性
    int j;
    int pos=k;

    for(j=L->length-1;j>=pos-1;j--)
    {//从最后一个位置开始移位,将需要插入的位置空出
        L->elem[j+1]=L->elem[j];
    }
    L->elem[pos-1]=e;
    L->length++;//每插入一个元素,顺序表长度加一,勿忘
    return 1;

}

void Mergelist(Sqlist *A,Sqlist *B,Sqlist *C)
{//需要合并的两表A和B,新表C
    Initlist1(C);//初始化C
    int i=1,j=1;
    int k=0;//k从0开始,为了下面方便
    int len_a=A->length,len_b=B->length;
    while((i<=len_a)&&(j<=len_b))
    {//只要有一个表已经遍历完毕,即可跳出循环
        if(A->elem[i-1]>B->elem[j-1])
        {
            Listinsert(C,++k,B->elem[j-1]);
            j++;
        }
        else {
                Listinsert(C,++k,A->elem[i-1]);
                i++;
        }
    }
    while(i<=len_a)//若A没有遍历完,则将A插入到新表后面
    {
        Listinsert(C,++k,A->elem[i-1]);
        i++;
    }
    while(j<=len_b)//与上面同理
    {
        Listinsert(C,++k,B->elem[j-1]);
        j++;
    }

}

void Display(Sqlist *L)//输出函数
{
    int i;
    for(i=0;i<L->length;i++)
    {
        printf(i==(L->length-1)?"%d\n":"%d ",L->elem[i]);
    }
}


int main()
{
    int m,n;
    Sqlist A,B,C;
    scanf("%d%d",&m,&n);
    Initlist(&A);
    Initlist(&B);
    Createlist(&A,m);
    Createlist(&B,n);
    Mergelist(&A,&B,&C);
    Display(&C);
    return 0;
}

此代码在codeblocks环境中运行。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值