//有序表合并
void MergeList_Sq(SqList LA,SqList LB,SqList *LC)
{
ElemType *pa = LA.data;
ElemType *pb = LB.data;
LC->length = LA.length+LB.length;
LC->data = (ElemType*)malloc(sizeof(ElemType)*LC->length);
ElemType *pc = LC->data;
ElemType *pa_last =LA.data + LA.length -1;
ElemType *pb_last =LB.data + LB.length -1;
while(pa<=pa_last && pb<=pb_last)
{
if(*pa<=*pb) *pc++ = *pa++;
else *pc++ = *pb++;
}
while (pa<=pa_last) *pc++ = *pa++;
while (pb<=pb_last) *pc++ = *pb++;
}
今天我们来填一下许久之前的一个坑,在王卓老师的课中有序表的合并c语言的实现。如上图所示:
首先简单介绍一下任务,就是给你两个线性表L1,L2,你将他们的所有元素(包括相同的元素)按由小到大的顺序合成一张表。
那我们该如何实现呢?
第一步:
从大的方面打比方:就像有两杯500ml的矿泉水要倒到1L的杯子里一样。我们首先需要构造一个一升的杯子。那我们就需要新构建一个能装1L的杯子元素,即为LC。
LC的构建就是顺序表的构建,我们需要关注的是他的长度,长度大小为两个需要合并的表之和。
第二步:
我们需要将元素排队放入我们构建好的杯子当中,可是这个时候就会有一个问题:即,当我们一点一点交替倒水的时候,总有一个杯子的水会先被倒完。我们的循环条件该怎么设置呢?
其实很简单:我们只需要将情况先分为两个杯子都有水跟不是两个杯子都有水就行了!那么我们循环结束的条件就是两个之中有一个的指针走到了最后一个元素。否则我们就继续往下走!
PS:
这里我们就要介绍一下*++p跟*p++有什么不同了。
首先我们应该知道的是:
1.++的优先级比*(取值)的优先级要高。
2.++p是指先++再进行其他的运算。p++则是等一切停止了语句结束前再对p进行++而不是对结果。
那么这里的*p++是指:取p的地址,再对p进行++。
所以说这里的代码写得如此简洁而高效。其逻辑是:对取出地址指向的值更新再自增。
第三步:
最后就是看看没空的将没空的全部倒入新的水杯中。就是这么简单