MFC中一个链表的实现

  1. #include "stdafx.h"   
  2. #include <stddef.h>   
  3. #include <Windows.h>   
  4. #include <iostream>   
  5. using namespace std;  
  6. //MFC中链表的实现   
  7. class CMySimpleList  
  8. {  
  9. public:  
  10.     CMySimpleList(int nNextOffset = 0);  
  11.     void Construct(int nNextOffset);  
  12.     BOOL IsEmpty(voidconst;  
  13.     void AddHead(void* p);  
  14.     void RemoveAll(void);  
  15.     void* GetHead(voidconst;  
  16.     void* GetNext(void* p) const;  
  17.     BOOL Remove(void* p);  
  18. public:  
  19.     void* m_pHead;  
  20.     size_t m_nNextOffset;  
  21.     void** GetNextPtr(void* p) const;  
  22. };  
  23. CMySimpleList::CMySimpleList(int nNextOffset) : m_nNextOffset(nNextOffset), m_pHead(NULL)  
  24. {  
  25. }  
  26. void CMySimpleList::Construct(int nNextOffset)  
  27. {  
  28.     m_nNextOffset = nNextOffset;  
  29. }  
  30. BOOL CMySimpleList::IsEmpty() const  
  31. {  
  32.     return (NULL == m_pHead);  
  33. }  
  34. void CMySimpleList::AddHead(void* p)  
  35. {  
  36.     *GetNextPtr(p) = m_pHead;  
  37.     m_pHead = p;  
  38. }  
  39. void* CMySimpleList::GetHead(voidconst  
  40. {  
  41.     return m_pHead;  
  42. }  
  43.   
  44. void* CMySimpleList::GetNext(void* p) const  
  45. {  
  46.     return *GetNextPtr(p);  
  47. }  
  48. BOOL CMySimpleList::Remove(void* p)  
  49. {  
  50.     BOOL bRet = FALSE;  
  51.       
  52.     if (NULL == p)  
  53.     {  
  54.         goto Exit0;  
  55.     }  
  56.     if (p == m_pHead)  
  57.     {  
  58.         m_pHead = *GetNextPtr(p);  
  59.         bRet = TRUE;  
  60.     }  
  61.     else  
  62.     {  
  63.         void* pTmp = m_pHead;  
  64.         while (pTmp != NULL && *GetNextPtr(pTmp) != p)  
  65.         {  
  66.             pTmp = *GetNextPtr(pTmp);  
  67.         }  
  68.         if (pTmp != NULL)  
  69.         {  
  70.             *GetNextPtr(pTmp) = *GetNextPtr(p);  
  71.             bRet = TRUE;  
  72.         }  
  73.     }  
  74. Exit0:  
  75.     return bRet;  
  76. }  
  77.   
  78. void CMySimpleList::RemoveAll(void)  
  79. {  
  80.     m_pHead = NULL;  
  81. }  
  82.   
  83. void** CMySimpleList::GetNextPtr(void* p) const  
  84. {  
  85.     return (void**)((BYTE*)p + m_nNextOffset);  
  86. }  
  87. //对上面的代码再进行一次封装   
  88. template<class TYPE>  
  89. class CMyTypedSimpleList : public CMySimpleList  
  90. {  
  91. public:  
  92.     CMyTypedSimpleList(int nNextOffset = 0) : CMySimpleList(nNextOffset)  
  93.     {  
  94.           
  95.     }  
  96.     TYPE GetHead(void)  
  97.     {  
  98.         return (TYPE)CMySimpleList::GetHead();  
  99.     }  
  100.     TYPE GetNext(TYPE p)  
  101.     {  
  102.         return (TYPE)CMySimpleList::GetNext((void*)p);  
  103.     }  
  104.     BOOL Remove(TYPE p)  
  105.     {  
  106.         return CMySimpleList::Remove((void*)p);  
  107.     }  
  108.     operator TYPE()  
  109.     {  
  110.         return (TYPE)CMySimpleList::GetHead();  
  111.     }  
  112.   
  113. };  
  114. struct MyData  
  115. {  
  116.     MyData* pNext;  
  117.     int nSomeData;  
  118. };  
  119. int _tmain(int argc, _TCHAR* argv[])  
  120. {  
  121.     /* 
  122.     CMySimpleList myList; 
  123.     MyData* pMyData = NULL; 
  124.     myList.Construct(offsetof(MyData, pNext)); 
  125.     for (int i = 0; i < 10; i++) 
  126.     { 
  127.         pMyData = new MyData; 
  128.         pMyData->nSomeData = i; 
  129.         myList.AddHead(pMyData); 
  130.     } 
  131.     pMyData = (MyData*)myList.GetHead(); 
  132.      
  133.     while(pMyData != NULL) 
  134.     { 
  135.         MyData* pTmp =  pMyData->pNext; 
  136.         cout << pMyData->nSomeData << endl; 
  137.         delete pMyData; 
  138.         pMyData = pTmp; 
  139.     } 
  140.     */  
  141.     CMyTypedSimpleList<MyData*> myList;  
  142.     MyData* pMyData = NULL;  
  143.     myList.Construct(offsetof(MyData, pNext));  
  144.     for (int i = 0; i < 10; i++)  
  145.     {  
  146.         pMyData = new MyData;  
  147.         pMyData->nSomeData = i;  
  148.         myList.AddHead(pMyData);  
  149.     }  
  150.     //pMyData = myList.GetHead();   
  151.     pMyData = myList;  
  152.     while(pMyData != NULL)  
  153.     {  
  154.         MyData* pTmp =  pMyData->pNext;  
  155.         cout << pMyData->nSomeData << endl;  
  156.         delete pMyData;  
  157.         pMyData = pTmp;  
  158.     }  
  159.     return 0;  
  160. }   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值