list.h
上传用户:tt_chan
上传日期:2009-12-03
资源大小:4523k
文件大小:6k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. /*
  2. List
  3. Date:
  4. 2001/02/05 
  5. Note: 
  6. 剧规氢 楷搬 府胶飘
  7. */
  8. #ifndef __ORZ_DATASTRUCTURE_LIST__
  9. #define __ORZ_DATASTRUCTURE_LIST__
  10. template< class T >
  11. class CListNode
  12. {
  13. public:
  14. T *m_pData;
  15. CListNode< T > *m_pPrev, *m_pNext;
  16. public:
  17. CListNode();
  18. virtual ~CListNode();
  19. void Clear( bool bDeleteArray );
  20. T * GetData();
  21. CListNode< T > * GetPrev();
  22. CListNode< T > * GetNext();
  23. operator T * () { return m_pData; }
  24. operator const T * const () { return (const T *) m_pData; }
  25. };
  26. template< class T >
  27. CListNode< T >::CListNode()
  28. {
  29. m_pData = NULL;
  30. m_pPrev = m_pNext = NULL;
  31. }
  32. template< class T >
  33. CListNode< T >::~CListNode()
  34. {
  35. }
  36. template< class T >
  37. void CListNode< T >::Clear( bool bDeleteArray )
  38. {
  39. if ( bDeleteArray )
  40. delete[] m_pData;
  41. else
  42. delete m_pData;
  43. }
  44. template< class T >
  45. T * CListNode< T >::GetData()
  46. {
  47. return m_pData;
  48. }
  49. template< class T >
  50. CListNode< T > * CListNode< T >::GetPrev()
  51. {
  52. return m_pPrev;
  53. }
  54. template< class T >
  55. CListNode< T > * CListNode< T >::GetNext()
  56. {
  57. return m_pNext;
  58. }
  59. template< class T >
  60. class CList
  61. {
  62. protected:
  63. CListNode< T > *m_pHead, *m_pTail;
  64. // Key甫 厚背且 锭 龋免登绰 窃荐
  65. int  (*m_pfnCmp)( void *pArg, T *pFirst, T *pSecond );
  66. void *m_pArgCmpFunc;
  67. int  m_nCount;
  68. public:
  69. CList();
  70. virtual ~CList();
  71. void ClearAll( bool bClearData = true, bool bDeleteArray = false );
  72. void SetCompareFunction( int (*pfnCmp)( void *pArg, T *pFirst, T *pSecond ), void *pArg );
  73. virtual bool Insert( T *pData );
  74. virtual bool InsertHead( T *pData );
  75. virtual bool InsertAt( CListNode< T > *pNode, T *pData );
  76. virtual T *  Remove( T *pKey );
  77. virtual T *  RemoveNode( CListNode< T > *pNode );
  78. virtual T *  Search( T *pKey );
  79. CListNode< T > * GetHead();
  80. CListNode< T > * GetTail();
  81. CListNode< T > * GetPrev( CListNode< T > *pNode );
  82. CListNode< T > * GetNext( CListNode< T > *pNode );
  83. int  GetCount();
  84. bool IsEmpty();
  85. CListNode< T > * operator[]( int nArray );
  86. };
  87. template< class T >
  88. CList< T >::CList()
  89. {
  90. m_pHead = NULL;
  91. m_pTail = NULL;
  92. m_pfnCmp = NULL;
  93. m_pArgCmpFunc = NULL;
  94. m_nCount = 0;
  95. }
  96. template< class T >
  97. CList< T >::~CList()
  98. {
  99. }
  100. template< class T >
  101. void CList< T >::ClearAll( bool bClearData, bool bDeleteArray )
  102. {
  103. CListNode< T > *pTemp;
  104. while ( m_pHead )
  105. {
  106. if ( bClearData )
  107. m_pHead->Clear( bDeleteArray );
  108. pTemp = m_pHead;
  109. m_pHead = m_pHead->m_pNext;
  110. if ( m_pHead )
  111. m_pHead->m_pPrev = NULL;
  112. delete pTemp;
  113. }
  114. m_pHead = NULL;
  115. m_pTail = NULL;
  116. m_pfnCmp = NULL;
  117. m_pArgCmpFunc = NULL;
  118. m_nCount = 0;
  119. }
  120. template< class T >
  121. void CList< T >::SetCompareFunction( int (*pfnCmp)( void *pArg, T *pFirst, T *pSecond ), void *pArg )
  122. {
  123. m_pfnCmp = pfnCmp;
  124. m_pArgCmpFunc = pArg;
  125. }
  126. template< class T >
  127. bool CList< T >::Insert( T *pData )
  128. {
  129. if ( m_pHead == NULL )
  130. {
  131. m_pHead = new CListNode< T >;
  132. if ( m_pHead == NULL )
  133. return false;
  134. m_pHead->m_pData = pData;
  135. m_pTail = m_pHead;
  136. }
  137. else
  138. {
  139. CListNode< T > *pNode = new CListNode< T >;
  140. if ( pNode == NULL )
  141. return false;
  142. pNode->m_pData   = pData;
  143. pNode->m_pNext   = NULL;
  144. pNode->m_pPrev   = m_pTail;
  145. m_pTail->m_pNext = pNode;
  146. m_pTail = pNode;
  147. }
  148. ++m_nCount;
  149. return true;
  150. }
  151. template< class T >
  152. bool CList< T >::InsertHead( T *pData )
  153. {
  154. if ( m_pHead == NULL )
  155. {
  156. m_pHead = new CListNode< T >;
  157. if ( m_pHead == NULL )
  158. return false;
  159. m_pHead->m_pData = pData;
  160. m_pTail = m_pHead;
  161. }
  162. else
  163. {
  164. CListNode< T > *pNode = new CListNode< T >;
  165. if ( pNode == NULL )
  166. return false;
  167. pNode->m_pData = pData;
  168. pNode->m_pNext = m_pHead;
  169. m_pHead->m_pPrev = pNode;
  170. m_pHead = pNode;
  171. }
  172. ++m_nCount;
  173. return true;
  174. }
  175. template< class T >
  176. bool CList< T >::InsertAt( CListNode< T > *pNode, T *pData )
  177. {
  178. CListNode< T > *pNew = new CListNode< T >;
  179. if ( pNew == NULL )
  180. return false;
  181. pNew->m_pData = pData;
  182. pNew->m_pPrev = pNode;
  183. pNew->m_pNext = pNode->m_pNext;
  184. if ( pNode->m_pNext )
  185. pNode->m_pNext->m_pPrev = pNew;
  186. pNode->m_pNext = pNew;
  187. if ( pNew->m_pNext == NULL )
  188. m_pTail = pNew;
  189. return true;
  190. }
  191. template< class T >
  192. T * CList< T >::Remove( T *pKey )
  193. {
  194. for ( CListNode< T > *pTemp = m_pHead; pTemp; pTemp = pTemp->m_pNext )
  195. {
  196. if ( m_pfnCmp( m_pArgCmpFunc, pKey, pTemp->m_pData ) == 0 )
  197. {
  198. pKey = pTemp->m_pData; 
  199. if ( m_pHead == pTemp )
  200. {
  201. m_pHead = m_pHead->m_pNext;
  202. if ( m_pHead )
  203. m_pHead->m_pPrev = NULL;
  204. else
  205. m_pTail = NULL;
  206. }
  207. else
  208. {
  209. if ( pTemp->m_pPrev )
  210. pTemp->m_pPrev->m_pNext = pTemp->m_pNext;
  211. if ( pTemp->m_pNext )
  212. pTemp->m_pNext->m_pPrev = pTemp->m_pPrev;
  213. else
  214. m_pTail = pTemp->m_pPrev;
  215. }
  216. delete pTemp;
  217. --m_nCount;
  218. return pKey;
  219. }
  220. }
  221. return NULL;
  222. }
  223. template< class T >
  224. T * CList< T >::RemoveNode( CListNode< T > *pNode )
  225. {
  226. T *pData = pNode->m_pData;
  227. if ( m_pHead == pNode )
  228. {
  229. m_pHead = pNode->m_pNext;
  230. if ( m_pHead )
  231. m_pHead->m_pPrev = NULL;
  232. else
  233. m_pTail = NULL;
  234. }
  235. else
  236. {
  237. if ( pNode->m_pPrev )
  238. pNode->m_pPrev->m_pNext = pNode->m_pNext;
  239. if ( pNode->m_pNext )
  240. pNode->m_pNext->m_pPrev = pNode->m_pPrev;
  241. else
  242. m_pTail = pNode->m_pPrev;
  243. }
  244. delete pNode;
  245. --m_nCount;
  246. return pData;
  247. }
  248. template< class T >
  249. T * CList< T >::Search( T *pKey )
  250. {
  251. for ( CListNode< T > *pTemp = m_pHead; pTemp; pTemp = pTemp->m_pNext )
  252. {
  253. if ( m_pfnCmp( m_pArgCmpFunc, pKey, pTemp->m_pData ) == 0 )
  254. return pTemp->m_pData; 
  255. }
  256. return NULL;
  257. }
  258. template< class T >
  259. CListNode< T > * CList< T >::GetHead()
  260. {
  261. return m_pHead;
  262. }
  263. template< class T >
  264. CListNode< T > * CList< T >::GetTail()
  265. {
  266. return m_pTail;
  267. }
  268. template< class T >
  269. CListNode< T > * CList< T >::GetPrev( CListNode< T > *pNode )
  270. {
  271. return pNode->GetPrev();
  272. }
  273. template< class T >
  274. CListNode< T > * CList< T >::GetNext( CListNode< T > *pNode )
  275. {
  276. return pNode->GetNext();
  277. }
  278. template< class T >
  279. int CList< T >::GetCount()
  280. {
  281. return m_nCount;
  282. }
  283. template< class T >
  284. bool CList< T >::IsEmpty()
  285. {
  286. return m_nCount == 0;
  287. }
  288. template< class T >
  289. CListNode< T > * CList< T >::operator []( int nArray )
  290. {
  291. for ( CListNode< T > *pTemp = m_pHead; pTemp; pTemp = pTemp->GetNext(), nArray-- )
  292. {
  293. if ( nArray == 0 )
  294. return pTemp;
  295. }
  296. return NULL;
  297. }
  298. #endif