Elementype GetElem(list L, Position pos) { if (pos<0 || pos>L->last) { return ERROR; } else { return L->Data[pos]; } } //给出LA LB俩个递增顺序表,要求合并成为LC有序链表(LC为空) struct LNode { Elementype Data[Maxszie]; Position Last }; //Last为最后一个下标值
今天上课的时候老师提到了这题,上课的时候脑子卡了,居然没做出来,在路上才想起来怎么操作
对于这道题首先考虑的是LA LB为空的三种情况,
void merge(list a,list b,list c)
2.即LA为空,LB不为空的时候,将LA的Data全部拷贝进去,将LC->Last调为LB->Last
3.即LB为空,LA不为空的时候,将LB的Data全部拷贝进去,将LC->Last调为LC->Last
这三种是比较先考虑的,拷贝for循环就对了;(为空的判断的条件为Last=-1)
if (a->Last == -1 && b->Last == -1) { return; } else if (a->Last != -1 && b->Last == -1) { for (int i = 0; i <= a->Last; i++) { c->Data[i] = a->Data[i]; } c->Last = a->Last; } else if (b->Last != -1 && a->Last == -1) { for (int i = 0; i <= b->Last; i++) { c->Data[i] = b->Data[i]; } c->Last = b->Last; }
接下来就是一些比较常规的情况了;我的想法是定义三个类似指针的玩意,来定位三个顺序表的下标。即pa =pb= pc=0;然后开始循环进行比较插入,判断pa pb对应位置的数据大小,那个小就把该下标下的data值赋给LC顺序表,循环下去直到pa 大于LA->Last,或者pb 大于LB->Last,最后只要还没有插入LC中的对应LA或LB的值全部插进LC
听到这里可能还有点懵,那么我们就用图来说明以下吧
刚开始的时候:
第一次以后,pa++,pc++
第二次 pa++,pc++
第三次:pb++,pc++
第四次:pa++,pc++
到这个时候我们发现pa已经大于LA-->Last ,接下来就只需要把LB后面的全部放进去就可以了
这就是完成这道题的基本思路了,那么如何将PB中未插的数据如何全部插入呢,很简单。一个for循环,我们可以知道这个时候 pa大于 LA->last 但pb小于LB->Last;所以只要for循环到pb大于LB->Last就可以了!!!
这个时候的控制条件一定要十小心!!!
在代码的时候要判断到底是LA全部插了还是LB全部插了,可以通过
if (pa > a->Last ) 这个是PA全部插入了
以下是代码实现:
else { c->Last = a->Last + b->Last + 1; int pa, pb, pc; pa = pb = pc = 0; for (; pa <= a->Last&&pb <=b->Last; pc++) //如果a的都插入或b全部插入了,就结束 { if (a->Data[pa]< b->Data[pb]) { c->Date[pc] = a->Data[pa]; pa++; } else { c->Data[pc] = b->Data[pb]; pb++; } } if (pa > a->Last ) //如果是a表的全部插入了,那么就将b表全部插入 { for (; pb <= b->Last; pb++,pc++) { c->Data[pc] = b->Data[pb]; } } else//如果是b表的全部插入了,那么就将a表全部插入 { for (; pa <= a->Last; pa++, pc++) { c->Data[pc] = a->Data[pa]; } } }