MFC中一个链表的实现
2010-04-18 21:31
190 查看
// blogListTest.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <stddef.h> #include <Windows.h> #include <iostream> using namespace std; //MFC中链表的实现 class CMySimpleList { public: CMySimpleList(int nNextOffset = 0); void Construct(int nNextOffset); BOOL IsEmpty(void) const; void AddHead(void* p); void RemoveAll(void); void* GetHead(void) const; void* GetNext(void* p) const; BOOL Remove(void* p); public: void* m_pHead; size_t m_nNextOffset; void** GetNextPtr(void* p) const; }; CMySimpleList::CMySimpleList(int nNextOffset) : m_nNextOffset(nNextOffset), m_pHead(NULL) { } void CMySimpleList::Construct(int nNextOffset) { m_nNextOffset = nNextOffset; } BOOL CMySimpleList::IsEmpty() const { return (NULL == m_pHead); } void CMySimpleList::AddHead(void* p) { *GetNextPtr(p) = m_pHead; m_pHead = p; } void* CMySimpleList::GetHead(void) const { return m_pHead; } void* CMySimpleList::GetNext(void* p) const { return *GetNextPtr(p); } BOOL CMySimpleList::Remove(void* p) { BOOL bRet = FALSE; if (NULL == p) { goto Exit0; } if (p == m_pHead) { m_pHead = *GetNextPtr(p); bRet = TRUE; } else { void* pTmp = m_pHead; while (pTmp != NULL && *GetNextPtr(pTmp) != p) { pTmp = *GetNextPtr(pTmp); } if (pTmp != NULL) { *GetNextPtr(pTmp) = *GetNextPtr(p); bRet = TRUE; } } Exit0: return bRet; } void CMySimpleList::RemoveAll(void) { m_pHead = NULL; } void** CMySimpleList::GetNextPtr(void* p) const { return (void**)((BYTE*)p + m_nNextOffset); } //对上面的代码再进行一次封装 template<class TYPE> class CMyTypedSimpleList : public CMySimpleList { public: CMyTypedSimpleList(int nNextOffset = 0) : CMySimpleList(nNextOffset) { } TYPE GetHead(void) { return (TYPE)CMySimpleList::GetHead(); } TYPE GetNext(TYPE p) { return (TYPE)CMySimpleList::GetNext((void*)p); } BOOL Remove(TYPE p) { return CMySimpleList::Remove((void*)p); } operator TYPE() { return (TYPE)CMySimpleList::GetHead(); } }; struct MyData { MyData* pNext; int nSomeData; }; int _tmain(int argc, _TCHAR* argv[]) { /* CMySimpleList myList; MyData* pMyData = NULL; myList.Construct(offsetof(MyData, pNext)); for (int i = 0; i < 10; i++) { pMyData = new MyData; pMyData->nSomeData = i; myList.AddHead(pMyData); } pMyData = (MyData*)myList.GetHead(); while(pMyData != NULL) { MyData* pTmp = pMyData->pNext; cout << pMyData->nSomeData << endl; delete pMyData; pMyData = pTmp; } */ CMyTypedSimpleList<MyData*> myList; MyData* pMyData = NULL; myList.Construct(offsetof(MyData, pNext)); for (int i = 0; i < 10; i++) { pMyData = new MyData; pMyData->nSomeData = i; myList.AddHead(pMyData); } //pMyData = myList.GetHead(); pMyData = myList; while(pMyData != NULL) { MyData* pTmp = pMyData->pNext; cout << pMyData->nSomeData << endl; delete pMyData; pMyData = pTmp; } return 0; }
相关文章推荐
- MFC中一个链表的实现
- mfc停车场的链表的实现
- 从尾到头打印链表中每个节点的值(采用栈实现)
- 双向链表的相关操作C++实现
- 数据结构基础(10) --单链表迭代器的设计与实现
- 链表基础以及约瑟夫环的实现
- 左神的书——《程序员代码面试指南》之逆置单链表或双链表 c++实现
- MyLinkedList(链表的实现)
- MFC定时器实现类似QQ桌面自动隐藏效果
- JAVA实现链表的反转(《剑指offer》)
- 数据结构练习--双向链表的实现
- 带头节点的单链表的实现
- 两种方法实现MFC 对话框最大化时控件也随比例最大化或者还原
- C++使用单指针Struct实现双向链表
- c++ 关于链表和链表实现栈
- CMAP原理及其在MFC中的实现
- MFC内单选按钮的实现
- 设计并实现一个散列表,使用链表(即链表)处理碰撞冲突
- Java中单链表的实现
- java_实现链表以及链表的测试类