【数据结构】顺序表合并

 合并函数

上一篇写顺序表的在这里

【数据结构】顺序表最全基本操作_Granitte的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/2301_76172693/article/details/132780714?spm=1001.2014.3001.5501  其中关于合并的代码有误,正版如下:

void MergeList(SqList a,SqList b,SqList &c)
{
  ElemType *pa,*pb,*pc,*palast,*pblast;
  pa=a.elem;pb=b.elem;
  c.listsize=c.length=a.length+b.length;
  pc=c.elem=(ElemType*)malloc(sizeof(ElemType)*c.listsize);
  if(!c.elem) exit(OVERLOW);//原文这里忘加分号了
  palast=pa+a.length-1;
  pblast=pb+b.length-1;
  while((pa<=palast)&&(pb<=pblast))
  {
    if(*pa<=*pb)
      *pc++=*pa++;
    else *pc++=*pb++;  
  }
  while(pa<=palast)
     *pc++=*pa++;
  while(pb<=pblast)
     *pc++=*pb++;
}

  else处原文写的是if(*pb<=*pa),等号与上一个if重复。没出错是因为当时采用了随机生成数字,肯定没有a、b表出现重复元素的情况。 

  解释一下这句代码:

 *pc++=*pa++;

它等价于这两句:

*pc=*pa;
*pa++;
*pc++;

具体执行内容如下:

  1. 将pa指向的值赋给pc指向的位置
  2. pa存储的地址值加一后赋给pa,即pa所指位置向后移了一位。顺序表是连续存储的,pa现在所指的是a表的下一位elem值。pc同理。

合并函数的执行过程如下图:

源代码及执行结果

#include <stdio.h>
#include <stdlib.h>
constexpr auto MaxSize = 100;
constexpr auto OK = 1;
constexpr auto ERROR = 0;
constexpr auto OVERLOW = -2;
typedef int Status;
typedef int ElemType;
typedef struct {
    ElemType* elem;//基地址
    int length;//线性表当前长度
    int listsize;//当前为线性表分配的存储容量(以sizeof(ElemType)为单位)
}SqList;
Status InitList(SqList& L)//创建空表
{
    L.elem = (ElemType*)malloc(MaxSize * sizeof(ElemType));
    if (!L.elem) exit(OVERLOW);
    L.length = 0;
    L.listsize = MaxSize;
    return OK;
}
Status ListWrite(SqList& L)//填充元素
{
    printf("向线性表中输入的元素个数\n");
    scanf_s("%d", &L.length);
    if ((!L.elem) || (L.length > MaxSize))
        return ERROR;
    printf("请输入%d个元素\n", L.length);
    for (int i = 0; i < L.length; i++)
        scanf_s("%d",&L.elem[i]); 
    return OK;
}
void PrintList(SqList L)//输出线性表
{
    for (int i = 0; i < L.length; i++)
        printf("%5d", L.elem[i]);
    printf("\n");
}
void MergeList(SqList a, SqList b, SqList& c)//合并
{
    ElemType* pa, * pb, * pc, * palast, * pblast;
    pa = a.elem; pb = b.elem;
    c.listsize = c.length = a.length + b.length;
    pc = c.elem = (ElemType*)malloc(sizeof(ElemType) * c.listsize);
    if (!c.elem) exit(OVERLOW);
    palast = pa + a.length - 1;
    pblast = pb + b.length - 1;
    while ((pa <= palast) && (pb <= pblast))
    {
        if (*pb <= *pa)
            *pc++ = *pb++;
        else *pc++ = *pa++;
    }
    while (pa <= palast)
        *pc++ = *pa++;
    while (pb <= pblast)
        *pc++ = *pb++;
}
int main(void)
{
    SqList a{}, b{}, c{};
    InitList(a); InitList(b); InitList(c);
    ListWrite(a); ListWrite(b); 
    printf("您已生成a表如下:\n");
    PrintList(a);
    printf("您已生成b表如下:\n");
    PrintList(b);
    MergeList(a, b, c);
    printf("合并结果如下:\n");
    PrintList(c);
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值