-
-
[原创]上课时老钱的代码重现:CDoubleList
-
发表于:
2008-6-12 21:22
5845
-
[原创]上课时老钱的代码重现:CDoubleList
[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日开班!