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

模拟服务器

开发平台:

Visual C++

  1. /******************************************************************************************************************
  2. DblList.h: interface for the CPDLList class.
  3. *******************************************************************************************************************/
  4. #ifndef _DBLLIST_H
  5. #define _DBLLIST_H
  6. using namespace std;
  7. template<class T>
  8. class CPDLList  
  9. {
  10. private:
  11. typedef struct tagNODE
  12. {
  13. T* ptypeData;
  14. tagNODE* pNextNode;
  15. tagNODE* pPrevNode;
  16. tagNODE(T* pData, tagNODE* pNext=NULL, tagNODE* pPrev=NULL)
  17. {
  18. ptypeData = pData;
  19. pNextNode = pNext;
  20. pPrevNode = pPrev;
  21. }
  22. }NODE, *LPNODE;
  23. LPNODE m_stHead;
  24. LPNODE m_pstCurrNode;
  25. LPNODE m_stTail;
  26. INT m_nCurrentPos;
  27. INT m_nCounter;
  28. public:
  29. CPDLList(CPDLList<T>& PDLList);
  30. // Constructor
  31. CPDLList()
  32. {
  33. m_stHead = NULL;
  34. m_stTail = NULL;
  35. m_pstCurrNode = NULL;
  36. m_nCounter = 0;
  37. m_nCurrentPos = 0;
  38. };
  39. // Destructor
  40. virtual ~CPDLList()
  41. {
  42. ClearAllNodes();
  43. };
  44. VOID AddNode(T* pData)
  45. {
  46. LPNODE pstTempNode = new NODE(pData);
  47. if ( m_stTail != NULL )
  48. {
  49. m_stTail->pNextNode    = pstTempNode;
  50. pstTempNode->pNextNode = pstTempNode;
  51. pstTempNode->pPrevNode = m_stTail;
  52. m_stTail = m_stTail->pNextNode;
  53. }
  54. else
  55. {
  56. m_stHead = pstTempNode;
  57. m_stHead->pPrevNode = m_stHead;
  58. m_stHead->pNextNode = m_stHead;
  59. m_stTail = m_stHead;
  60. m_pstCurrNode = m_stHead;
  61. }
  62. m_nCounter++;
  63. };
  64. BOOL DeleteCurrentNode(VOID)
  65. {
  66. LPNODE pstTempNode;
  67. if ( m_pstCurrNode != NULL )
  68. {
  69. m_nCounter--;
  70. m_pstCurrNode->pPrevNode->pNextNode = m_pstCurrNode->pNextNode;
  71. m_pstCurrNode->pNextNode->pPrevNode = m_pstCurrNode->pPrevNode;
  72. pstTempNode = m_pstCurrNode;
  73. m_pstCurrNode = m_pstCurrNode->pNextNode;
  74. if ( pstTempNode == m_pstCurrNode ) // Current = Tail ?
  75. {
  76. m_stTail = m_stTail->pPrevNode;
  77. m_pstCurrNode = m_pstCurrNode->pPrevNode;
  78. m_pstCurrNode->pNextNode = m_pstCurrNode;
  79. m_nCurrentPos--;
  80. if ( m_pstCurrNode == pstTempNode ) // Current = Head = Tail ?
  81. {
  82. m_stHead = NULL;
  83. m_stTail = NULL;
  84. m_pstCurrNode = NULL;
  85. m_nCurrentPos = 0;
  86. }
  87. }
  88. else if(pstTempNode == m_stHead) // Current  = Head ?
  89. {
  90. m_stHead = pstTempNode->pNextNode;
  91. m_pstCurrNode = pstTempNode->pNextNode;
  92. m_pstCurrNode->pPrevNode = m_pstCurrNode;
  93. if ( pstTempNode == m_stHead ) // Current = Head = Tail ?
  94. {
  95. m_stHead = NULL;
  96. m_stTail = NULL;
  97. m_pstCurrNode = NULL;
  98. m_nCurrentPos = 0;
  99. }
  100. }
  101. SAFE_DELETE(pstTempNode->ptypeData);
  102. SAFE_DELETE(pstTempNode);
  103. return TRUE;
  104. }
  105. else
  106. {
  107. return FALSE;
  108. }
  109. };
  110. // 寇何俊辑 typeData甫 瘤快绰 屈怕捞促.
  111. BOOL DeleteCurrentNodeEx(VOID)
  112. {
  113. LPNODE pstTempNode;
  114. if ( m_pstCurrNode != NULL )
  115. {
  116. m_nCounter--;
  117. m_pstCurrNode->pPrevNode->pNextNode = m_pstCurrNode->pNextNode;
  118. m_pstCurrNode->pNextNode->pPrevNode = m_pstCurrNode->pPrevNode;
  119. pstTempNode = m_pstCurrNode;
  120. m_pstCurrNode = m_pstCurrNode->pNextNode;
  121. if ( pstTempNode == m_pstCurrNode ) // Current = Tail ?
  122. {
  123. m_stTail = m_stTail->pPrevNode;
  124. m_pstCurrNode = m_pstCurrNode->pPrevNode;
  125. m_pstCurrNode->pNextNode = m_pstCurrNode;
  126. m_nCurrentPos--;
  127. if ( m_pstCurrNode == pstTempNode ) // Current = Head = Tail ?
  128. {
  129. m_stHead = NULL;
  130. m_stTail = NULL;
  131. m_pstCurrNode = NULL;
  132. m_nCurrentPos = 0;
  133. }
  134. }
  135. else if(pstTempNode == m_stHead) // Current  = Head ?
  136. {
  137. m_stHead = pstTempNode->pNextNode;
  138. m_pstCurrNode = pstTempNode->pNextNode;
  139. m_pstCurrNode->pPrevNode = m_pstCurrNode;
  140. if ( pstTempNode == m_stHead ) // Current = Head = Tail ?
  141. {
  142. m_stHead = NULL;
  143. m_stTail = NULL;
  144. m_pstCurrNode = NULL;
  145. m_nCurrentPos = 0;
  146. }
  147. }
  148. SAFE_DELETE(pstTempNode);
  149. return TRUE;
  150. }
  151. else
  152. {
  153. return FALSE;
  154. }
  155. };
  156. INT ListLength(VOID)
  157. {
  158. return m_nCounter;
  159. };
  160. INT MoveNextNode(VOID)
  161. {
  162. LPNODE pstTempNode;
  163. if ( m_pstCurrNode && m_pstCurrNode->pNextNode )
  164. {
  165. pstTempNode = m_pstCurrNode;
  166. m_pstCurrNode = pstTempNode->pNextNode;
  167. m_nCurrentPos = (m_nCurrentPos<m_nCounter) ? m_nCurrentPos+1: m_nCounter;
  168. }
  169. return m_nCurrentPos;
  170. };
  171. INT MovePreviousNode(VOID)
  172. {
  173. LPNODE pstTempNode;
  174. pstTempNode = m_pstCurrNode;
  175. m_pstCurrNode = pstTempNode->pPrevNode;
  176. m_nCurrentPos = (m_nCurrentPos>1) ? m_nCurrentPos-1: 1;
  177. return m_nCurrentPos;
  178. };
  179. INT MoveNode(INT nMovement)
  180. {
  181. if ( nMovement > 0 )
  182. {
  183. for ( INT nLoops = 0; nLoops < nMovement; nLoops++ )
  184. MoveNextNode();
  185. }
  186. else
  187. {
  188. nMovement = (-nMovement);
  189. for ( INT nLoops = 0; nLoops < nMovement; nLoops++)
  190. MovePreviousNode();
  191. }
  192. return m_nCurrentPos;
  193. };
  194. VOID MoveCurrentToTop(VOID)
  195. {
  196. m_pstCurrNode = m_stHead;
  197. m_nCurrentPos = 0;
  198. };
  199. VOID MoveCurrentToTail(VOID)
  200. {
  201. m_pstCurrNode = m_stTail;
  202. m_nCurrentPos = m_nCounter-1;
  203. };
  204. VOID ClearAllNodes(VOID)
  205. {
  206. LPNODE pstTempNode;
  207. if ( m_nCounter > 0 )
  208. {
  209. for ( INT nLoops = 0; nLoops < m_nCounter; nLoops++ )
  210. {
  211. pstTempNode = m_stHead;
  212. m_stHead = m_stHead->pNextNode;
  213. SAFE_DELETE(pstTempNode->ptypeData);
  214. SAFE_DELETE(pstTempNode);
  215. }
  216. }
  217. m_nCounter = 0;
  218. m_stHead = NULL;
  219. m_stTail = NULL;
  220. m_pstCurrNode = NULL;
  221. m_nCurrentPos =0;
  222. };
  223. T* GetCurrentData(VOID)
  224. {
  225. return m_pstCurrNode->ptypeData;
  226. };
  227. INT GetCounter(VOID)
  228. {
  229. return m_nCounter;
  230. };
  231. INT GetCurrPosition(VOID)
  232. {
  233. return m_nCurrentPos;
  234. };
  235. BOOL IsCurrentTail(VOID)
  236. {
  237. if ( m_pstCurrNode == m_stTail )
  238. return TRUE;
  239. else
  240. return FALSE;
  241. };
  242. BOOL IsCurrentHead(VOID)
  243. {
  244. if (m_pstCurrNode == m_stHead )
  245. return TRUE;
  246. else
  247. return FALSE;
  248. }
  249. BOOL CheckEmpty()
  250. {
  251. if ( m_stHead == NULL )
  252. return TRUE;
  253. else
  254. return FALSE;
  255. }
  256. };
  257. #endif  //_DBLLIST_H