List

#ifndef _DBLINK_H
#define _DBLINK_H

template<typename Type>

class DBLink
{
public:
	DBLink() 
	{
		Init();
	}

	DBLink(const DBLink &link) 
	{
		Init();
		operator=(link);
	}

	const DBLink& operator= (const DBLink &link)
	{
		if (this != &link)
		{
			Clear();
			

			for (Const_Iterator it = link.Begin(); it != link.End(); it++)
			{
				push_back(*it);
			}
		}

		return (*this);
	}
public:
	void Reserve()
	{
		Node *pNodeTemp = m_pFirst;

		while(pNodeTemp != NULL)
		{ 
			Node *pTemppPrev = pNodeTemp->pPrev;
			
			pNodeTemp->pPrev = pNodeTemp->pNext;
			pNodeTemp->pNext = pTemppPrev;
			
			pNodeTemp = pNodeTemp->pPrev;
		}

		pNodeTemp = m_pFirst;
		m_pFirst = m_pEnd;
		m_pEnd = pNodeTemp;
	}

	void push_back(const Type& tValue)
	{
		m_pEnd->pPrev = m_pEnd->pPrev->pNext = new Node(tValue, m_pEnd->pPrev, m_pEnd);
		m_iLen++;
	}

	void pop_back()
	{
		Erase(--End());
	}

	~DBLink()
	{
		Clear();
		delete m_pFirst;
		delete m_pEnd;
	}


public:
	void Clear()
	{
		while(m_iLen)
		{
			pop_back();
		}
	}
private:
	typedef struct _Node
	{
		Type   tData;
		_Node *pPrev;
		_Node *pNext;
		_Node(const Type& t = Type(), _Node *p = NULL, _Node *n = NULL) : 
                       tData(t), pPrev(p), pNext(n)
		{
			
		}
	}Node;

public:
	class Const_Iterator
	{
	public:
		Const_Iterator() : m_pNode(NULL)
		{
			
		}

		explicit Const_Iterator(Node *pNode) : m_pNode(pNode)
		{
			
		}

	public:
		const Type& operator*() const
		{
			return m_pNode->tData;
		}

		bool operator==(const Const_Iterator &it)
		{
			return (it.m_pNode == m_pNode);
		}

		bool operator!=(const Const_Iterator &it)
		{
			return !(*this == it);
		}

		const Const_Iterator & operator++()
		{
			m_pNode = m_pNode->pNext;
			return (*this);
		}

		const Const_Iterator  operator++(int)
		{
			Const_Iterator old = *this;
			++(*this);
			return old;
		}
	protected:
		Node *m_pNode;
	};

	class Iterator : public Const_Iterator
	{
	public:
		friend DBLink<typename Type>;
		Iterator()
		{

		}

		Type& operator*() 
		{
			return m_pNode->tData;
		}

		const Type& operator*() const
		{
			return m_pNode->tData;
		}

		explicit Iterator(Node *pNode) : Const_Iterator(pNode)
		{

		}

		Iterator& operator++()
		{
			m_pNode = m_pNode->pNext;
			return (*this);
		}

		Iterator operator++(int)
		{
			Iterator old(m_pNode);
			++(*this);
			return old;
		}

		Iterator& operator--()
		{
			m_pNode = m_pNode->pPrev;
			return (*this);
		}
	};

public:
	const Const_Iterator Begin() const
	{
		return Const_Iterator(m_pFirst->pNext);
	}

	const Const_Iterator End() const 
	{
		return Const_Iterator(m_pEnd);
	}

	Iterator Begin()
	{
		return Iterator(m_pFirst->pNext);
	}

	Iterator End()
	{
		return Iterator(m_pEnd);
	}

	Iterator Erase(Iterator it)
	{
		Node *p = it.m_pNode;
		Iterator retval(p->pNext);
		
		p->pPrev->pNext = p->pNext;
		p->pNext->pPrev = p->pPrev;

		delete p;
		m_iLen--;
		
		return retval;
	}

private:
	void Init()
	{
		m_pFirst = new Node();
		m_pEnd = new Node();

		m_pFirst->pNext = m_pEnd;
		m_pEnd->pPrev = m_pFirst;

		m_iLen = 0;
	}
private:
	Node *m_pFirst;
	Node *m_pEnd;
	int m_iLen;
};

#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值