合并函数
上一篇写顺序表的在这里
【数据结构】顺序表最全基本操作_Granitte的博客-CSDN博客https://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++;
具体执行内容如下:
- 将pa指向的值赋给pc指向的位置
- 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;
}