合并顺序表

这篇博客介绍如何合并两个非递减顺序排列的线性表,通过动态分配存储空间,实现合并后的顺序表仍保持非递减顺序。文章包含代码实现,展示了如何初始化线性表、插入元素以及合并线性表的详细步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给出两个按非递减顺序排列的线性表,将它们合并后存放在另一个顺序表中

合并后的顺序表同样非递减

 

#include<stdio.h>
#include<stdlib.h>
#define list_init_size 100  //在这里设置线性表长度可以方便以后的修改 
#define listincrement 10
#define ok 1
#define overflow -1
#define error 0

typedef int status;  //自定义status为int型,以后看到status等价于int 

//线性表的动态分配线性存储结构 
typedef struct {
    int *elem;   //存储空间基址
    int length;  //当前长度
    int listsize; //当前分配的存储容量 
}sqlist;

//构造一个空的线性表L 
status initlist_sq(sqlist &l)
{
    l.elem=(int *)malloc(list_init_size*sizeof(int)); //    
    if(!l.elem)   
    {     
        printf("线性表构造失败!\n");
        exit(overflow);   //存储分配失败 
    } 
    l.length=0;
    l.listsize=list_init_size;
    printf("线性表构造成功!\n");
    return ok;
}

//插入元素
status listinsert_sq(sqlist &l,int i,int e)  // 
{
    int *newbase,*p,*q;   //临时变量 
    if((i<1)||(i>l.length+1)) 
    {
        printf("您输入的数据有误,请重新输入!\n");
        return error;        //i值非法
   }
    if(l.length>=l.listsize)
    {
        newbase = (int *)realloc(l.elem,(l.listsize+listincrement)*sizeof(int));
        if(!newbase)  exit(overflow);
        l.elem=newbase;
        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;

 
void mergelist(sqlist la,sqlist lb,sqlist &lc)\
{
    //已知顺序线性表la和lb的元素按非递减排列
    //归并La和Lb得到新的顺序表lc,lc也非递减
    int *pa,*pb,*pc,*pa_last,*pb_last;
    pa=la.elem;  //pa指向顺序表la的首元素 
    pb=lb.elem;   //pb指向顺序表lb的首元素 
    lc.listsize=lc.length=la.length+lb.length;
       //lc的长度设置为la与lb的长度之和 
    pc=lc.elem=(int *)malloc(lc.listsize*sizeof(int));
       //给lc分配一段存储空间,pc指向顺序表lc的首地址 
    if(!lc.elem)  
        exit(overflow);  //内存分配失败 
    pa_last=la.elem+la.length-1;  //记录pa的终点 
    pb_last=lb.elem+lb.length-1;    //记录pb的终点 
    while(pa<=pa_last&&pb<=pb_last)
    {
        if(*pa<=*pb)  //由于是非递增排序,所以优先插入数值较小的元素 
            *pc++=*pa++;   //pa指向的值插入pc指向的地址,两个指针同时加一 
        else 
            *pc++=*pb++;
    }
    
    //执行完上面的语句后,较短的顺序表中的元素全部插入C中
    //接下来插入较长的顺序表中剩余的元素
    //由于不知道谁更长,所以两个都写下 
    while(pa<=pa_last)
        *pc++=*pa++;
    while(pb<=pb_last)
        *pc++=*pb++;
 } 
 
int main()
{
    int c,b;
    sqlist la,lb,lc;
    //初始化顺序表la,lb,lc 
    initlist_sq(la);
    initlist_sq(lb);
    initlist_sq(lc);
    //给la赋值 
    for(int i=1;i<20;i++)
        listinsert_sq(la,i,i-1);
    //给lb赋值 
    for(int i=1;i<20;i++)
        listinsert_sq(lb,i,20*i-1);
    //合并la,lb,lc 
    mergelist(la,lb,lc);
    
    //输出合并后的lc中所有元素 
    for(int i=0;i<lc.length;i++)
        printf("%d ",lc.elem[i]);
    printf("\n");
    
    return 0;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值