鱼C论坛

 找回密码
 立即注册
查看: 2297|回复: 2

[技术交流] 链表Sequencer与Unlink Sequencer

[复制链接]
发表于 2014-1-23 12:55:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 andalousie 于 2014-1-26 10:08 编辑

代码源自《C++ in Action》的练习题,书中解答只写出了主要代码。这里提供完整代码。
这个程序是通过序列器访问链表以及通过解链序列器删除链表元素的实例。
list.h
  1. #if !defined (LIST_H)
  2. #define LIST_H

  3. class Link
  4. {
  5. public:
  6.         Link (Link* pNext, int id)
  7.                 : _pNext (pNext), _id (id) {}
  8.         Link *  Next () const { return _pNext; }
  9.         void    SetNext (Link* pNext) { _pNext = pNext; }
  10.         int     Id () const { return _id; }
  11. private:
  12.         Link *  _pNext;
  13.         int     _id;
  14. };

  15. class List
  16. {
  17.         friend class UnlinkSeq;
  18. public:
  19.         List (): _pHead (0) {}
  20.         ~List ();
  21.         void Add ( int id );
  22.         Link const * GetHead () const { return _pHead; }
  23. protected:
  24.         Link*  _pHead;
  25. };

  26. // List sequencer
  27. // Usage:
  28. // for (ListSeq seq (list);
  29. //                        !seq.AtEnd ();
  30. //                        seq.Advance ())
  31. // {
  32. //         int id = seq.GetId ();
  33. //        ...
  34. // }

  35. class ListSeq
  36. {
  37. public:
  38.         ListSeq (List const & list)
  39.                 : _pLink (list.GetHead ()) {}
  40.         bool AtEnd () const { return _pLink == 0; }
  41.         void Advance () { _pLink = _pLink->Next (); }
  42.         int GetId () const { return _pLink->Id (); }
  43. private:
  44.         Link const * _pLink; // current link
  45. };

  46. class UnlinkSeq
  47. {
  48. public:
  49.         UnlinkSeq(List & list)
  50.                 : _list(list),
  51.                   _cur(list._pHead),
  52.                   _prev(0)
  53.         {}
  54.         bool AtEnd() const { return _cur == 0; }
  55.         void Advance()
  56.         {
  57.                 _prev = _cur;
  58.                 _cur  = _cur->Next();
  59.         }
  60.         int Id() const { return _cur->Id(); }
  61.         void Unlink();
  62. private:
  63.         List & _list;
  64.         Link * _cur;
  65.         Link * _prev;
  66. };

  67. #endif
复制代码
list.cpp
  1. #include "List.h"
  2. #include <iostream>
  3. #include <cassert>

  4. List::~List ()
  5. {
  6.         // free the list
  7.         while ( _pHead != 0 )
  8.         {
  9.                 Link* pLink = _pHead;
  10.                 _pHead = _pHead->Next(); // unlink pLink
  11.                 delete pLink;
  12.         }
  13. }

  14. void List::Add ( int id )
  15. {
  16.         // add in front of the list
  17.         Link * pLink = new Link (_pHead, id);
  18.         _pHead = pLink;
  19. }

  20. void UnlinkSeq::Unlink()
  21. {
  22.         assert(_cur != 0);
  23.         if(_prev == 0)
  24.         {
  25.                 assert(_cur == _list._pHead);
  26.                 _list._pHead = _cur->Next();
  27.         }
  28.         else
  29.         {
  30.                 _prev->SetNext(_cur->Next());
  31.         }
  32.         delete _cur;
  33.         _cur = 0;
  34. }

  35. int main ()
  36. {
  37.         List list;
  38.         list.Add (1);
  39.         list.Add (2);
  40.         list.Add (5);
  41.         list.Add (3);
  42.         std::cout << "List contents:\n";
  43.         for (Link const * pLink = list.GetHead();
  44.                  pLink != 0;
  45.                  pLink = pLink->Next ())
  46.         {
  47.                 std::cout << pLink->Id() << " ";
  48.         }
  49.         std::cout << std::endl;
  50.         //Another method using sequencer
  51.         std::cout << "List sequencer:\n";
  52.         for (ListSeq seq (list);
  53.                                 !seq.AtEnd ();
  54.                                 seq.Advance ())
  55.         {
  56.                 std::cout << seq.GetId () << " ";
  57.         }
  58.         std::cout << std::endl;
  59.         //using unlink sequencer
  60.         //to delete an element
  61.         UnlinkSeq useq (list);
  62.         while (useq.Id () != 5)
  63.                 useq.Advance();
  64.         if(!useq.AtEnd()) useq.Unlink();
  65.         for (ListSeq seq (list);
  66.                                 !seq.AtEnd ();
  67.                                 seq.Advance ())
  68.         {
  69.                 std::cout << seq.GetId () << " ";
  70.         }
  71.         return 0;
  72. }
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-1-26 10:07:48 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-27 09:35:40 | 显示全部楼层
谢谢分享~!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-8 20:39:04 | 显示全部楼层
路过看看 = =
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-13 03:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表