代码:
/********************************************************************
  created:  2008/06/12
  filename: DoubleList.h
  author:   happymouse

  version:  v1.0.0.0
*********************************************************************/
#pragma once

#include <cassert>

// Double list node template class
template<typename T>
class CDoubleListNode
{
public:
    // Data
    T m_data;
    // Next data
    CDoubleListNode<T> *m_pNext;
    // Prior data
    CDoubleListNode<T> *m_pPrior;
    // Constructor
    CDoubleListNode(){}
    // Constructor
    CDoubleListNode(const T& data): m_data(data){}
};

// Double list template class
template<typename T>
class CDoubleList
{
private:
    // List count
    int m_nCount;
    
    // Head data node pointer
    CDoubleListNode<T> *m_pHeadNode;
    
    // Head data node
    CDoubleListNode<T> m_HeadNode;
    
    // Get node at index.(0 is the head node)
    CDoubleListNode<T> * GetAt(const int& nIndex)
    {
        assert(nIndex >= 0 && nIndex <= m_nCount);
        CDoubleListNode<T> * _pRet = m_pHeadNode;
        for (int i = 0; i < nIndex; i++)
        {
            _pRet = _pRet->m_pNext;
        }
        return _pRet;
    }
    
    // Clear list
    void Clear()
    {
        while (m_nCount > 0)
        {
            RemoveAt(1);
        }
    }
public:
    // Constructor
    CDoubleList()
        :m_nCount(0)
    {
        m_pHeadNode = m_HeadNode.m_pNext = m_HeadNode.m_pPrior = &m_HeadNode;
    }
    
    // Destructor
    virtual ~CDoubleList()
    {
        Clear();
    }
    
    // Remove node at index. (index start at 1)
    bool RemoveAt(const int& nIndex)
    {
        assert(nIndex >= 0 && nIndex <= m_nCount);
        CDoubleListNode<T> * _pDeleteNode = GetAt(nIndex);
        CDoubleListNode<T> * _pNode = _pDeleteNode->m_pNext;
        _pDeleteNode->m_pPrior->m_pNext = _pDeleteNode->m_pNext;
        _pNode->m_pPrior = _pDeleteNode->m_pPrior;
        delete _pDeleteNode;
        m_nCount--;
        return true;
    }
    
    // Get count of list
    int GetCount()
    {
        return m_nCount;
    }
    
    // Insert a data into head of list
    bool InsertHead(const T& data)
    {
        return InsertAfter(0, data);
    }
    
    // Insert a data into list before a index.(index start at 1)
    bool InsertBefore(const int &nIndex, const T& data)
    {
        assert(nIndex > 0 && nIndex <= m_nCount);
        CDoubleListNode<T> * _pNewNode = new CDoubleListNode<T>(data);
        assert(NULL != _pNewNode);
        if (NULL == _pNewNode)
        {
            return false;
        }
        CDoubleListNode<T> * _pNode = GetAt(nIndex);
        _pNewNode->m_pNext = _pNode;
        _pNewNode->m_pPrior = _pNode->m_pPrior;
        _pNewNode->m_pPrior->m_pNext = _pNewNode;
        _pNode->m_pPrior = _pNewNode;
        m_nCount++;
        return true;
    }
    
    // Insert a data info tail of list
    bool InsertTail(const T& data)
    {
        return InsertAfter(m_nCount, data);
    }
    
    // Insert a data into list after a index.(index start at 1)
    bool InsertAfter(const int &nIndex, const T& data)
    {
        assert(nIndex >= 0 && nIndex <= m_nCount);
        CDoubleListNode<T> * _pNewNode = new CDoubleListNode<T>(data);
        assert(NULL != _pNewNode);
        if (NULL == _pNewNode)
        {
            return false;
        }
        CDoubleListNode<T> * _pNode = GetAt(nIndex);
        _pNewNode->m_pNext = _pNode->m_pNext;
        _pNewNode->m_pPrior = _pNode;
        _pNewNode->m_pNext->m_pPrior = _pNewNode;
        _pNode->m_pNext = _pNewNode;
        m_nCount++;
        return true;
    }
    
    // Get node at index. (index start at 1)
    CDoubleListNode<T> * operator[](const int &nIndex)
    {
        return GetAt(nIndex);
    }
};