关于合并两有序线性表算法的一点思考

    今天学习了有关线性表的一些内容,里面的一个有关合并两个升序线性表的算法我感觉不用那么累赘,只需要一个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不采用以上这个算法的原因吧。安全地规避风险的软件工程思维和重要。

posted @ 2010-09-07 00:16  玫瑰De葬礼  阅读(782)  评论(0)    收藏  举报