DLinkedList.h
上传用户:cydong117
上传日期:2009-11-10
资源大小:638k
文件大小:5k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. /******************************************************************************************************************
  2. DLinkedList.h: interface for the CDLList class.
  3. *******************************************************************************************************************/
  4. #if !defined(AFX_DLINKEDLIST_H__FA0909F7_8D66_4986_83D4_12A536AEACE2__INCLUDED_)
  5. #define AFX_DLINKEDLIST_H__FA0909F7_8D66_4986_83D4_12A536AEACE2__INCLUDED_
  6. #if _MSC_VER > 1000
  7. #pragma once
  8. #endif // _MSC_VER > 1000
  9. using namespace std;
  10. template<class T>
  11. class CDLList  
  12. {
  13. private:
  14. typedef struct tagNODE
  15. {
  16. T typeData;
  17. tagNODE* pNextNode;
  18. tagNODE* pPrevNode;
  19. tagNODE(T data, tagNODE* pNext=NULL, tagNODE* pPrev=NULL)
  20. {
  21. typeData = data;
  22. pNextNode = pNext;
  23. pPrevNode = pPrev;
  24. }
  25. }NODE, *LPNODE;
  26. LPNODE m_stHead;
  27. LPNODE m_pstCurrNode;
  28. LPNODE m_stTail;
  29. INT m_nCurrentPos;
  30. INT m_nCounter;
  31. public:
  32. CDLList(CDLList<T>& DLList);
  33. // Constructor
  34. CDLList()
  35. {
  36. m_stHead = NULL;
  37. m_stTail = NULL;
  38. m_pstCurrNode = NULL;
  39. m_nCounter = 0;
  40. m_nCurrentPos = 0;
  41. };
  42. // Destructor
  43. virtual ~CDLList()
  44. {
  45. ClearAllNodes();
  46. };
  47. VOID AddNode(T data)
  48. {
  49. LPNODE pstTempNode = new NODE(data);
  50. if ( m_stTail != NULL )
  51. {
  52. m_stTail->pNextNode = pstTempNode;
  53. pstTempNode->pNextNode = pstTempNode;
  54. pstTempNode->pPrevNode = m_stTail;
  55. m_stTail = m_stTail->pNextNode;
  56. }
  57. else
  58. {
  59. m_stHead = pstTempNode;
  60. m_stHead->pPrevNode = m_stHead;
  61. m_stHead->pNextNode = m_stHead;
  62. m_stTail = m_stHead;
  63. m_pstCurrNode = m_stHead;
  64. }
  65. m_nCounter++;
  66. };
  67. BOOL DeleteCurrentNode(VOID)
  68. {
  69. LPNODE pstTempNode;
  70. if ( m_pstCurrNode != NULL )
  71. {
  72. m_nCounter--;
  73. m_pstCurrNode->pPrevNode->pNextNode = m_pstCurrNode->pNextNode;
  74. m_pstCurrNode->pNextNode->pPrevNode = m_pstCurrNode->pPrevNode;
  75. pstTempNode = m_pstCurrNode;
  76. m_pstCurrNode = m_pstCurrNode->pNextNode;
  77. if ( pstTempNode == m_pstCurrNode ) // Current = Tail ?
  78. {
  79. m_stTail = m_stTail->pPrevNode;
  80. m_pstCurrNode = m_pstCurrNode->pPrevNode;
  81. m_pstCurrNode->pNextNode = m_pstCurrNode;
  82. m_nCurrentPos--;
  83. if ( m_pstCurrNode == pstTempNode ) // Current = Head = Tail ?
  84. {
  85. m_stHead = NULL;
  86. m_stTail = NULL;
  87. m_pstCurrNode = NULL;
  88. m_nCurrentPos = 0;
  89. }
  90. }
  91. else if(pstTempNode == m_stHead) // Current  = Head ?
  92. {
  93. m_stHead = pstTempNode->pNextNode;
  94. m_pstCurrNode = pstTempNode->pNextNode;
  95. m_pstCurrNode->pPrevNode = m_pstCurrNode;
  96. if ( pstTempNode == m_stHead ) // Current = Head = Tail ?
  97. {
  98. m_stHead = NULL;
  99. m_stTail = NULL;
  100. m_pstCurrNode = NULL;
  101. m_nCurrentPos = 0;
  102. }
  103. }
  104. delete pstTempNode;
  105. return TRUE;
  106. }
  107. else
  108. {
  109. return FALSE;
  110. }
  111. };
  112. INT ListLength(VOID)
  113. {
  114. return m_nCounter;
  115. };
  116. INT MoveNextNode(VOID)
  117. {
  118. LPNODE pstTempNode;
  119. if ( m_pstCurrNode && m_pstCurrNode->pNextNode )
  120. {
  121. pstTempNode = m_pstCurrNode;
  122. m_pstCurrNode = pstTempNode->pNextNode;
  123. m_nCurrentPos = (m_nCurrentPos<m_nCounter) ? m_nCurrentPos+1: m_nCounter;
  124. }
  125. return m_nCurrentPos;
  126. };
  127. INT MovePreviousNode(VOID)
  128. {
  129. LPNODE pstTempNode;
  130. pstTempNode = m_pstCurrNode;
  131. m_pstCurrNode = pstTempNode->pPrevNode;
  132. m_nCurrentPos = (m_nCurrentPos>1) ? m_nCurrentPos-1: 1;
  133. return m_nCurrentPos;
  134. };
  135. INT MoveNode(INT nMovement)
  136. {
  137. if ( nMovement > 0 )
  138. {
  139. for ( INT nLoops = 0; nLoops < nMovement; nLoops++ )
  140. MoveNextNode();
  141. }
  142. else
  143. {
  144. nMovement = (-nMovement);
  145. for ( INT nLoops = 0; nLoops < nMovement; nLoops++)
  146. MovePreviousNode();
  147. }
  148. return m_nCurrentPos;
  149. };
  150. VOID MoveCurrentToTop(VOID)
  151. {
  152. m_pstCurrNode = m_stHead;
  153. m_nCurrentPos = 0;
  154. };
  155. VOID MoveCurrentToTail(VOID)
  156. {
  157. m_pstCurrNode = m_stTail;
  158. m_nCurrentPos = m_nCounter-1;
  159. };
  160. VOID ClearAllNodes(VOID)
  161. {
  162. LPNODE pstTempNode;
  163. if ( m_nCounter > 0 )
  164. {
  165. for ( INT nLoops = 0; nLoops < m_nCounter; nLoops++ )
  166. {
  167. pstTempNode = m_stHead;
  168. m_stHead = m_stHead->pNextNode;
  169. delete pstTempNode;
  170. }
  171. }
  172. m_nCounter = 0;
  173. m_stHead = NULL;
  174. m_stTail = NULL;
  175. m_pstCurrNode = NULL;
  176. m_nCurrentPos =0;
  177. };
  178. T* GetCurrentData(VOID)
  179. {
  180. return &(m_pstCurrNode->typeData);
  181. };
  182. INT GetCounter(VOID)
  183. {
  184. return m_nCounter;
  185. };
  186. INT GetCurrPosition(VOID)
  187. {
  188. return m_nCurrentPos;
  189. };
  190. BOOL IsCurrentTail(VOID)
  191. {
  192. if ( m_pstCurrNode == m_stTail )
  193. return TRUE;
  194. else
  195. return FALSE;
  196. };
  197. BOOL IsCurrentHead(VOID)
  198. {
  199. if (m_pstCurrNode == m_stHead )
  200. return TRUE;
  201. else
  202. return FALSE;
  203. }
  204. BOOL CheckEmpty()
  205. {
  206. if ( m_stHead == NULL )
  207. return TRUE;
  208. else
  209. return FALSE;
  210. }
  211. };
  212. #endif // !defined(AFX_DLINKEDLIST_H__FA0909F7_8D66_4986_83D4_12A536AEACE2__INCLUDED_)