关于合并两有序线性表算法的一点思考
今天学习了有关线性表的一些内容,里面的一个有关合并两个升序线性表的算法我感觉不用那么累赘,只需要一个while就能实现。这里有个小技巧:在将要合并的两个线性表的末尾分别添加一个哨兵结点(这也是借鉴许多经典算法的编程技巧),关键代码如下:
/*
*==Date==
*Lc: Destination list
*La, Lb: Source list, non-descending order
*==Method==
*appand(element): Add an element at the end of the list
*setStart(): Point to the first element in the list
*==Others==
*INF: Infinite
*/
Lc.clear();
La.appand(INF); Lb.appand(INF);
La.setStart(); Lb.setStart();
La.getValue(a); Lb.getValue(b);
while (!(a == INF && b == INF)) {
if (a <= b) {
Lc.append(a);
La.next();
La.getValue(a);
}
else {
Lc.append(b);
Lb.next();
Lb.getValue(b);
}
}
La.remove(INF); Lb.remove(INF);
return Lc;
但是这个算法的应用有个前置条件:La或者Lb非满。因为存在这样的一个问题:当表满的时候,哨兵结点插入失败。也就是说起不到哨兵的作用了。我想这也应该是经典合并算法和SGI STL不采用以上这个算法的原因吧。安全地规避风险的软件工程思维和重要。

浙公网安备 33010602011771号