鱼C论坛

 找回密码
 立即注册
查看: 2769|回复: 0

[技术交流] 一个简单的双向循环链表(FIFO)

[复制链接]
发表于 2014-1-31 21:46:51 | 显示全部楼层 |阅读模式

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

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

x
list.h

  1. #if !defined (LIST_H)
  2. #define LIST_H

  3. class DLink
  4. {
  5. public:
  6.         DLink (int id)
  7.                 : _id (id)
  8.         {
  9.                 _pPrev = this;
  10.                 _pNext = this;
  11.         }
  12.         DLink *  Prev () const { return _pPrev; }
  13.         DLink *  Next () const { return _pNext; }
  14.         void    SetPrev (DLink* pPrev) { _pPrev = pPrev; }
  15.         void    SetNext (DLink* pNext) { _pNext = pNext; }
  16.         int     Id () const { return _id; }
  17.         void    Unlink();
  18. private:
  19.         DLink *  _pPrev;
  20.         DLink *  _pNext;
  21.         int     _id;
  22. };

  23. class List
  24. {
  25. public:
  26.         List (): _pHead (0) {}
  27.         ~List ();
  28.         void    Put ( int id );
  29.         int     Get ();
  30.         DLink const * GetHead () const { return _pHead; }
  31. protected:
  32.         DLink*  _pHead;
  33. };

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

  4. void DLink::Unlink()
  5. {
  6.   assert (_pNext != 0);
  7.   assert (_pPrev != 0);
  8.   _pNext->SetPrev (_pPrev);
  9.   _pPrev->SetNext (_pNext);
  10.   _pPrev = this;
  11.   _pNext = this;
  12. }

  13. void List::Put (int id)
  14. {
  15.   DLink * pLink = new DLink (id);
  16.   if (_pHead == 0)
  17.     _pHead = pLink;
  18.   else
  19.   {
  20.     pLink->SetNext (_pHead);
  21.     pLink->SetPrev (_pHead->Prev ());
  22.     _pHead->Prev ()->SetNext (pLink);
  23.     _pHead->SetPrev (pLink);
  24.     _pHead = pLink;
  25.   }
  26. }

  27. int List::Get ()
  28. {
  29.   assert (_pHead != 0);
  30.   DLink * pLink = _pHead->Prev ();
  31.   if (pLink == _pHead) // last one
  32.     _pHead = 0;
  33.   pLink->Unlink ();
  34.   int result = pLink->Id ();
  35.   delete pLink;
  36.   return result;
  37. }

  38. List::~List ()
  39. {
  40.   // free the list
  41.   while ( _pHead != 0 )
  42.   {
  43.     DLink * pLink = _pHead->Prev ();
  44.     if (pLink == _pHead)
  45.       _pHead = 0;
  46.     pLink->Unlink (); // unlink pLink
  47.     delete pLink;
  48.   }
  49. }

  50. int main ()
  51. {
  52.   List list;
  53.   list.Put (1);
  54.   list.Put (2);
  55.   list.Put (5);
  56.   list.Put (3);
  57.   std::cout << list.Get ();
  58.   return 0;
  59. }
复制代码


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-17 14:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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