鱼C论坛

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

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

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

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

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

x
list.h
#if !defined (LIST_H)
#define LIST_H

class DLink
{
public:
        DLink (int id) 
                : _id (id)
        {
                _pPrev = this;
                _pNext = this;
        }
        DLink *  Prev () const { return _pPrev; }
        DLink *  Next () const { return _pNext; }
        void    SetPrev (DLink* pPrev) { _pPrev = pPrev; }
        void    SetNext (DLink* pNext) { _pNext = pNext; }
        int     Id () const { return _id; }
        void    Unlink();
private:
        DLink *  _pPrev;
        DLink *  _pNext;
        int     _id;
};

class List
{
public:
        List (): _pHead (0) {}
        ~List ();
        void    Put ( int id );
        int     Get ();
        DLink const * GetHead () const { return _pHead; }
protected: 
        DLink*  _pHead;
};

#endif
list.cpp
#include "List.h"
#include <iostream>
#include <cassert>

void DLink::Unlink()
{
  assert (_pNext != 0);
  assert (_pPrev != 0);
  _pNext->SetPrev (_pPrev);
  _pPrev->SetNext (_pNext);
  _pPrev = this;
  _pNext = this;
}

void List::Put (int id)
{
  DLink * pLink = new DLink (id);
  if (_pHead == 0)
    _pHead = pLink;
  else
  {
    pLink->SetNext (_pHead);
    pLink->SetPrev (_pHead->Prev ());
    _pHead->Prev ()->SetNext (pLink);
    _pHead->SetPrev (pLink);
    _pHead = pLink;
  }
}

int List::Get ()
{
  assert (_pHead != 0);
  DLink * pLink = _pHead->Prev ();
  if (pLink == _pHead) // last one
    _pHead = 0;
  pLink->Unlink ();
  int result = pLink->Id ();
  delete pLink;
  return result;
}

List::~List ()
{
  // free the list
  while ( _pHead != 0 )
  {
    DLink * pLink = _pHead->Prev ();
    if (pLink == _pHead)
      _pHead = 0;
    pLink->Unlink (); // unlink pLink
    delete pLink;
  }
}

int main ()
{
  List list;
  list.Put (1);
  list.Put (2);
  list.Put (5);
  list.Put (3); 
  std::cout << list.Get ();
  return 0;
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 02:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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