首页
社区
课程
招聘
[原创]上课时老钱的代码重现:CDoubleList
发表于: 2008-6-12 21:22 5845

[原创]上课时老钱的代码重现:CDoubleList

2008-6-12 21:22
5845
[color=#008000]/********************************************************************
  created:  2008/06/12
  filename: DoubleList.h
  author:   happymouse

  version:  v1.0.0.0
*********************************************************************/[/color]
[color=#0000D0]#pragma[/color] [color=#0000D0]once[/color]

[color=#0000D0]#include[/color] <cassert>

[color=#008000]// Double list node template class[/color]
[color=#0000D0]template[/color]<[color=#0000D0]typename[/color] T>
[color=#0000D0]class[/color] CDoubleListNode
{
[color=#0000D0]public[/color]:
    [color=#008000]// Data[/color]
    T m_data;
    [color=#008000]// Next data[/color]
    CDoubleListNode<T> *m_pNext;
    [color=#008000]// Prior data[/color]
    CDoubleListNode<T> *m_pPrior;
    [color=#008000]// Constructor[/color]
    CDoubleListNode(){}
    [color=#008000]// Constructor[/color]
    CDoubleListNode([color=#0000D0]const[/color] T& [color=#0000D0]data[/color]): m_data([color=#0000D0]data[/color]){}
};

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

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 7
支持
分享
最新回复 (4)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
耗子喜欢E文注释?
2008-6-12 21:49
0
雪    币: 216
活跃值: (12)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
觉得老外的英文注释比较Cool!
所以就模仿一下咯!
其实是觉得有时候中文反而比较难表达出想要表达的意思哈!
2008-6-12 21:57
0
雪    币: 306
活跃值: (153)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
不是一般人
2010-5-24 21:39
0
雪    币: 334
活跃值: (22)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
忽然反应过来,....
要叫钱老师
2010-5-25 21:00
0
游客
登录 | 注册 方可回帖
返回