64,683
社区成员
发帖
与我相关
我的任务
分享
//-----------------------------------------------------------------------------
#pragma once
typedef void* PNODE;
template<class TYPE>
class CXList
{
protected:
struct TNode{TNode* pNext;TNode* pPrev;TYPE data;};
ULONG m_nCount;
HANDLE m_hHeapMem;
TNode* m_pNodeHead;
TNode* m_pNodeTail;
TNode* m_pNodeFree;
protected:
void _FreeNode(TNode* pNode);
PNODE _NewNode(TNode* pPrev, TNode* pNext);
public:
CXList();
~CXList();
BOOL Initialize(ULONG nInitSize = 10);
void Uninitialize();
ULONG GetCount();
TYPE* GetHead();
TYPE* GetTail();
TYPE* GetAt(PNODE pNode);
TYPE* GetNext(PNODE pNode);
TYPE* GetPrev(PNODE pNode);
TYPE* operator[](UINT nIndex);
BOOL IsEmpty();
void RemoveAt(PNODE pNode);
void RemoveAll();
void RemoveHead();
void RemoveTail();
PNODE AddHead(CXList* pNewList);
PNODE AddTail(CXList* pNewList);
PNODE AddHead(TYPE newElement);
PNODE AddTail(TYPE newElement);
BOOL SetAt(PNODE pNode, TYPE newElement);
PNODE InsertBefore(PNODE pNode, TYPE newElement);
PNODE InsertAfter(PNODE pNode, TYPE newElement);
PNODE Find(TYPE searchValue, PNODE pNode=NULL);
PNODE FindIndex(ULONG nIndex);
};
//-----------------------------------------------------------------------------
template<class TYPE>
CXList<TYPE>::CXList()
{
}
template<class TYPE>
CXList<TYPE>::~CXList()
{
}
template<class TYPE>
inline void CXList<TYPE>::_FreeNode(TNode* pNode)
{
m_nCount--;
pNode->data.~TYPE();
if (m_hHeapMem != INVALID_HANDLE_VALUE)
{
if (HeapFree(m_hHeapMem,0,pNode)==TRUE)
{
return;
}
}
MessageBox(NULL,TEXT("_FreeNode failed!"),TEXT("Error"),MB_ICONERROR|MB_OK);
}
template<class TYPE>
inline PNODE CXList<TYPE>::_NewNode(TNode* pPrev, TNode* pNext)
{
if (m_hHeapMem==INVALID_HANDLE_VALUE)
{
m_hHeapMem = HeapCreate(NULL,1024,0);
if (m_hHeapMem==INVALID_HANDLE_VALUE)
{
return NULL;
}
}
TNode *pNode = (TNode*)HeapAlloc(m_hHeapMem,HEAP_ZERO_MEMORY,sizeof(TNode));
if (pNode!=NULL)
{
pNode->pPrev = pPrev;
pNode->pNext = pNext;
if (pPrev!=NULL)
{
pPrev->pNext = pNode;
}
if (pNext!=NULL)
{
pNext->pPrev = pNode;
}
m_nCount++;
}
return pNode;
}
template<class TYPE>
BOOL CXList<TYPE>::Initialize(ULONG nInitSize = 10)
{
m_nCount = 0;
m_hHeapMem = INVALID_HANDLE_VALUE;
m_pNodeHead = NULL;
m_pNodeTail = NULL;
m_pNodeFree = NULL;
m_hHeapMem = HeapCreate(NULL,nInitSize,0);
if (m_hHeapMem==INVALID_HANDLE_VALUE)
{
return FALSE;
}
return TRUE;
}
template<class TYPE>
void CXList<TYPE>::Uninitialize()
{
RemoveAll();
}
template<class TYPE>
TYPE* CXList<TYPE>::operator[](UINT nIndex)
{
TNode* pNode = (TNode*)FindIndex(nIndex);
return &(pNode->data);
}
template<class TYPE>
inline ULONG CXList<TYPE>::GetCount()
{
return m_nCount;
}
template<class TYPE>
inline TYPE* CXList<TYPE>::GetHead()
{
return m_pNodeHead==NULL ? NULL : &(m_pNodeHead->data);
}
template<class TYPE>
inline TYPE* CXList<TYPE>::GetTail()
{
return m_pNodeTail==NULL ? NULL : &(m_pNodeTail->data);
}
template<class TYPE>
inline TYPE* CXList<TYPE>::GetAt(PNODE pNode)
{
TNode* pNODE = (TNode*)pNode;
return pNODE==NULL ? NULL : &(pNODE->data);
}
template<class TYPE>
inline TYPE* CXList<TYPE>::GetNext(PNODE pNode)
{
TNode* pNODE = (TNode*)pNode;
if (pNODE != NULL)
{
pNODE = pNODE->pNext;
return pNODE==NULL ? NULL : &(pNODE->data);
}
return NULL;
}
template<class TYPE>
inline TYPE* CXList<TYPE>::GetPrev(PNODE pNode)
{
TNode* pNODE = (TNode*)pNode;
if (pNODE != NULL)
{
pNODE = pNODE->pPrev;
return pNODE==NULL ? NULL : &(pNODE->data);
}
return NULL;
}
template<class TYPE>
inline BOOL CXList<TYPE>::IsEmpty()
{
return m_nCount==0 ? TRUE : FALSE;
}
template<class TYPE>
PNODE CXList<TYPE>::AddHead(CXList* pNewList)
{
if (pNewList!=NULL)
{
TNode* pNewNode = NULL;
ULONG nCount = pNewList->GetCount();
for (TNode* pIndex=pNewList->FindIndex(nCount-1); pIndex!=NULL; pIndex=pIndex->pPrev)
{
pNewNode = NULL;
pNewNode = (TNode*)_NewNode(NULL, m_pNodeHead);
if (pNewNode != NULL)
{
pNewNode->data = pIndex->data;
m_pNodeHead = pNewNode;
if (m_pNodeTail==NULL)
{
m_pNodeTail = pNewNode;
}
}
}
}
return m_pNodeHead;
}
template<class TYPE>
PNODE CXList<TYPE>::AddTail(CXList* pNewList)
{
if (pNewList!=NULL)
{
TNode* pNewNode = NULL;
for (TNode* pIndex=pNewList->FindIndex(0); pIndex!=NULL; pIndex=pIndex->pPrev)
{
pNewNode = NULL;
pNewNode = (TNode*)_NewNode(m_pNodeTail, NULL);
if (pNewNode != NULL)
{
pNewNode->data = pIndex->data;
m_pNodeTail = pNewNode;
if (m_pNodeHead==NULL)
{
m_pNodeHead = pNewNode;
}
}
}
}
return m_pNodeTail;
}
template<class TYPE>
PNODE CXList<TYPE>::AddHead(TYPE newElement)
{
TNode* pNewNode = (TNode*)_NewNode(NULL, m_pNodeHead);
if (pNewNode != NULL)
{
pNewNode->data = newElement;
m_pNodeHead = pNewNode;
if (m_pNodeTail==NULL)
{
m_pNodeTail = pNewNode;
}
}
return pNewNode;
}
template<class TYPE>
PNODE CXList<TYPE>::AddTail(TYPE newElement)
{
TNode* pNewNode = (TNode*)_NewNode(m_pNodeTail, NULL);
if (pNewNode != NULL)
{
pNewNode->data = newElement;
m_pNodeTail = pNewNode;
if (m_pNodeHead == NULL)
{
m_pNodeHead = pNewNode;
}
}
return pNewNode;
}
template<class TYPE>
void CXList<TYPE>::RemoveAt(PNODE pNode)
{
if (pNode != NULL)
{
TNode* pNODE = (TNode*)pNode;
TNode* pPrev = pNODE->pPrev;
TNode* pNext = pNODE->pNext;
if (pNODE==m_pNodeHead)
{
m_pNodeHead = m_pNodeHead->pNext;
}
else
{
pPrev->pNext = pNext;
}
if (pNODE==m_pNodeTail)
{
m_pNodeTail = m_pNodeTail->pPrev;
}
else
{
pNext->pPrev = pPrev;
}
_FreeNode(pNODE);
}
}
template<class TYPE>
void CXList<TYPE>::RemoveAll()
{
for (TNode* pIndex=m_pNodeHead; pIndex!=NULL; pIndex=pIndex->pNext)
{
pIndex->data.~TYPE();
}
if (m_hHeapMem != INVALID_HANDLE_VALUE)
{
if (HeapDestroy(m_hHeapMem)==TRUE)
{
m_nCount = 0;
m_pNodeHead = NULL;
m_pNodeTail = NULL;
m_hHeapMem = INVALID_HANDLE_VALUE;
return;
}
}
MessageBox(NULL,TEXT("RemoveAll failed!"),TEXT("Error"),MB_ICONERROR|MB_OK);
}
template<class TYPE>
void CXList<TYPE>::RemoveHead()
{
if (m_pNodeHead != NULL)
{
TNode *pNodeFree = m_pNodeHead;
m_pNodeHead = m_pNodeHead->pNext;
_FreeNode(pNodeFree);
}
else
{
m_pNodeTail = NULL;
}
}
template<class TYPE>
void CXList<TYPE>::RemoveTail()
{
if (m_pNodeTail != NULL)
{
TNode *pNodeFree = m_pNodeTail;
m_pNodeTail = m_pNodeTail->pPrev;
_FreeNode(pNodeFree);
}
else
{
m_pNodeHead = NULL;
}
}
template<class TYPE>
BOOL CXList<TYPE>::SetAt(PNODE pNode, TYPE newElement)
{
if (pNode != NULL)
{
TNode* pNODE = (TNode*)pNode;
pNODE->data = newElement;
return TRUE;
}
return FALSE;
}
template<class TYPE>
PNODE CXList<TYPE>::InsertBefore(PNODE pNode, TYPE newElement)
{
if (pNode!=NULL)
{
TNode* pNODE = (TNode*)pNode;
TNode* pNew = _NewNode(pNODE->pPrev,pNODE);
if (pNew != NULL)
{
pNew->data = newElement;
if (pNew->pPrev==NULL)
{
m_pNodeHead = pNew;
}
return pNew;
}
}
return NULL;
}
template<class TYPE>
PNODE CXList<TYPE>::InsertAfter(PNODE pNode, TYPE newElement)
{
if (pNode!=NULL)
{
TNode* pNODE = (TNode*)pNode;
TNode* pNew = _NewNode(pNODE,pNODE->pNext);
if (pNew != NULL)
{
pNew->data = newElement;
if (pNew->pNext==NULL)
{
m_pNodeTail = pNew;
}
return pNew;
}
}
return NULL;
}
template<class TYPE>
inline PNODE CXList<TYPE>::Find(TYPE searchValue, PNODE pNode)
{
for (TNode* pIndex=m_pNodeHead; pIndex!=NULL; pIndex=pIndex->pNext)
{
if (pIndex->data==searchValue)
{
return pIndex;
}
}
return NULL;
}
template<class TYPE>
inline PNODE CXList<TYPE>::FindIndex(ULONG nIndex)
{
if (nIndex<0 || nIndex>m_nCount)
{
return NULL;
}
else
{
TNode* pIndex = m_pNodeHead;
for (ULONG i=0; i<nIndex; i++)
{
if (pIndex != NULL)
{
pIndex = pIndex->pNext;
}
}
return pIndex;
}
}
template <class _Tp, class _Alloc = __STL_DEFAULT_ALLOCATOR(_Tp) >
class list;
所以如果你嫌弃malloc的话,完全可以定制你自己的Allocator,比如名字叫MyHeapAlloc,然后这么使用:
std::list <SomeType, MyHeapAlloc <SomeType> > mylist;
现在你明白我的意思了吧,你想到的,其实别人都已经仔细考虑过了。pNewNode->data = newElement;
当然,我可能看漏了.....
//--------------------------------------------------------------------------------------------------------------------------------
#pragma once
typedef void* PNODE;
template<class TYPE>
class CXList
{
protected:
struct TNode{TNode* pNext;TNode* pPrev;TYPE data;};
ULONG m_nCount;
HANDLE m_hHeapMem;
TNode* m_pNodeHead;
TNode* m_pNodeTail;
protected:
void _FreeNode(TNode* pNode);
PNODE _NewNode(TNode* pPrev, TNode* pNext);
public:
CXList();
~CXList();
BOOL Initialize(ULONG nInitSize = 10);
void Uninitialize();
ULONG GetCount();
TYPE* GetHead();
TYPE* GetTail();
TYPE* GetAt(PNODE pNode);
TYPE* GetNext(PNODE pNode);
TYPE* GetPrev(PNODE pNode);
TYPE* operator[](UINT nIndex);
BOOL IsEmpty();
void RemoveAt(PNODE pNode);
void RemoveAll();
void RemoveHead();
void RemoveTail();
PNODE AddHead(CXList* pNewList);
PNODE AddTail(CXList* pNewList);
PNODE AddHead(TYPE newElement);
PNODE AddTail(TYPE newElement);
BOOL SetAt(PNODE pNode, TYPE newElement);
PNODE InsertBefore(PNODE pNode, TYPE newElement);
PNODE InsertAfter(PNODE pNode, TYPE newElement);
PNODE Find(TYPE searchValue, PNODE pNode=NULL);
PNODE FindIndex(ULONG nIndex);
};
//---------------------------------------------------------------------------------------------------------------
template<class TYPE>
CXList<TYPE>::CXList()
{
}
template<class TYPE>
CXList<TYPE>::~CXList()
{
}
template<class TYPE>
inline void CXList<TYPE>::_FreeNode(TNode* pNode)
{
pNode->data.~TYPE();
if (m_hHeapMem != INVALID_HANDLE_VALUE)
{
if (HeapFree(m_hHeapMem,0,pNode)==TRUE)
{
m_nCount--;
m_nCount = min(m_nCount,0);
return;
}
}
MessageBox(NULL,TEXT("_FreeNode failed!"),TEXT("Error"),MB_ICONERROR|MB_OK);
}
template<class TYPE>
inline PNODE CXList<TYPE>::_NewNode(TNode* pPrev, TNode* pNext)
{
if (m_hHeapMem==INVALID_HANDLE_VALUE)
{
m_hHeapMem = HeapCreate(NULL,1024,0);
if (m_hHeapMem==INVALID_HANDLE_VALUE)
{
return NULL;
}
}
TNode *pNode = (TNode*)HeapAlloc(m_hHeapMem,HEAP_ZERO_MEMORY,sizeof(TNode));
if (pNode!=NULL)
{
pNode->pPrev = pPrev;
pNode->pNext = pNext;
if (pPrev!=NULL)
{
pPrev->pNext = pNode;
}
if (pNext!=NULL)
{
pNext->pPrev = pNode;
}
m_nCount++;
}
return pNode;
}
template<class TYPE>
BOOL CXList<TYPE>::Initialize(ULONG nInitSize = 10)
{
m_nCount = 0;
m_hHeapMem = INVALID_HANDLE_VALUE;
m_pNodeHead = NULL;
m_pNodeTail = NULL;
m_hHeapMem = HeapCreate(NULL,nInitSize,0);
if (m_hHeapMem==INVALID_HANDLE_VALUE)
{
return FALSE;
}
return TRUE;
}
template<class TYPE>
void CXList<TYPE>::Uninitialize()
{
RemoveAll();
}
template<class TYPE>
inline ULONG CXList<TYPE>::GetCount()
{
return m_nCount;
}
template<class TYPE>
inline TYPE* CXList<TYPE>::GetHead()
{
return m_pNodeHead==NULL ? NULL : &(m_pNodeHead->data);
}
template<class TYPE>
inline TYPE* CXList<TYPE>::GetTail()
{
return m_pNodeTail==NULL ? NULL : &(m_pNodeTail->data);
}
template<class TYPE>
inline TYPE* CXList<TYPE>::GetAt(PNODE pNode)
{
TNode* pNODE = (TNode*)pNode;
return pNODE==NULL ? NULL : &(pNODE->data);
}
template<class TYPE>
inline TYPE* CXList<TYPE>::GetNext(PNODE pNode)
{
TNode* pNODE = (TNode*)pNode;
if (pNODE != NULL)
{
pNODE = pNODE->pNext;
return pNODE==NULL ? NULL : &(pNODE->data);
}
return NULL;
}
template<class TYPE>
inline TYPE* CXList<TYPE>::GetPrev(PNODE pNode)
{
TNode* pNODE = (TNode*)pNode;
if (pNODE != NULL)
{
pNODE = pNODE->pPrev;
return pNODE==NULL ? NULL : &(pNODE->data);
}
return NULL;
}
template<class TYPE>
TYPE* CXList<TYPE>::operator[](UINT nIndex)
{
TNode* pNode = (TNode*)FindIndex(nIndex);
return pNode==NULL ? NULL : &(pNode->data);
}
template<class TYPE>
inline BOOL CXList<TYPE>::IsEmpty()
{
return m_nCount==0 ? TRUE : FALSE;
}
template<class TYPE>
PNODE CXList<TYPE>::AddHead(CXList* pNewList)
{
if (pNewList!=NULL)
{
TNode* pNewNode = NULL;
ULONG nCount = pNewList->GetCount();
for (TNode* pIndex=pNewList->FindIndex(nCount-1); pIndex!=NULL; pIndex=pIndex->pPrev)
{
pNewNode = NULL;
pNewNode = (TNode*)_NewNode(NULL, m_pNodeHead);
if (pNewNode != NULL)
{
pNewNode->data = pIndex->data;
m_pNodeHead = pNewNode;
if (m_pNodeTail==NULL)
{
m_pNodeTail = pNewNode;
}
}
}
}
return m_pNodeHead;
}
template<class TYPE>
PNODE CXList<TYPE>::AddTail(CXList* pNewList)
{
if (pNewList!=NULL)
{
TNode* pNewNode = NULL;
for (TNode* pIndex=pNewList->FindIndex(0); pIndex!=NULL; pIndex=pIndex->pPrev)
{
pNewNode = NULL;
pNewNode = (TNode*)_NewNode(m_pNodeTail, NULL);
if (pNewNode != NULL)
{
pNewNode->data = pIndex->data;
m_pNodeTail = pNewNode;
if (m_pNodeHead==NULL)
{
m_pNodeHead = pNewNode;
}
}
}
}
return m_pNodeTail;
}
template<class TYPE>
PNODE CXList<TYPE>::AddHead(TYPE newElement)
{
TNode* pNewNode = (TNode*)_NewNode(NULL, m_pNodeHead);
if (pNewNode != NULL)
{
pNewNode->data = newElement;
m_pNodeHead = pNewNode;
if (m_pNodeTail==NULL)
{
m_pNodeTail = pNewNode;
}
}
return pNewNode;
}
template<class TYPE>
PNODE CXList<TYPE>::AddTail(TYPE newElement)
{
TNode* pNewNode = (TNode*)_NewNode(m_pNodeTail, NULL);
if (pNewNode != NULL)
{
pNewNode->data = newElement;
m_pNodeTail = pNewNode;
if (m_pNodeHead == NULL)
{
m_pNodeHead = pNewNode;
}
}
return pNewNode;
}
template<class TYPE>
void CXList<TYPE>::RemoveAt(PNODE pNode)
{
if (pNode != NULL)
{
TNode* pNODE = (TNode*)pNode;
TNode* pPrev = pNODE->pPrev;
TNode* pNext = pNODE->pNext;
if (m_pNodeHead==pNODE)
{
m_pNodeHead = m_pNodeHead->pNext;
}
else
{
pPrev->pNext = pNext;
}
if (m_pNodeTail==pNODE)
{
m_pNodeTail = m_pNodeTail->pPrev;
}
else
{
pNext->pPrev = pPrev;
}
_FreeNode(pNODE);
}
}
template<class TYPE>
void CXList<TYPE>::RemoveAll()
{
for (TNode* pIndex=m_pNodeHead; pIndex!=NULL; pIndex=pIndex->pNext)
{
pIndex->data.~TYPE();
}
if (m_hHeapMem != INVALID_HANDLE_VALUE)
{
if (HeapDestroy(m_hHeapMem)==TRUE)
{
m_nCount = 0;
m_pNodeHead = NULL;
m_pNodeTail = NULL;
m_hHeapMem = INVALID_HANDLE_VALUE;
return;
}
}
MessageBox(NULL,TEXT("RemoveAll failed!"),TEXT("Error"),MB_ICONERROR|MB_OK);
}
template<class TYPE>
void CXList<TYPE>::RemoveHead()
{
if (m_pNodeHead != NULL)
{
TNode *pNodeFree = m_pNodeHead;
m_pNodeHead = m_pNodeHead->pNext;
if (m_pNodeHead==NULL)
{
m_pNodeTail = NULL;
}
_FreeNode(pNodeFree);
}
}
template<class TYPE>
void CXList<TYPE>::RemoveTail()
{
if (m_pNodeTail != NULL)
{
TNode *pNodeFree = m_pNodeTail;
m_pNodeTail = m_pNodeTail->pPrev;
if (m_pNodeTail==NULL)
{
m_pNodeHead = NULL;
}
_FreeNode(pNodeFree);
}
}
template<class TYPE>
BOOL CXList<TYPE>::SetAt(PNODE pNode, TYPE newElement)
{
if (pNode != NULL)
{
TNode* pNODE = (TNode*)pNode;
pNODE->data = newElement;
return TRUE;
}
return FALSE;
}
template<class TYPE>
PNODE CXList<TYPE>::InsertBefore(PNODE pNode, TYPE newElement)
{
if (pNode!=NULL)
{
TNode* pNODE = (TNode*)pNode;
TNode* pNew = _NewNode(pNODE->pPrev,pNODE);
if (pNew != NULL)
{
pNew->data = newElement;
if (pNew->pPrev==NULL)
{
m_pNodeHead = pNew;
}
return pNew;
}
}
return NULL;
}
template<class TYPE>
PNODE CXList<TYPE>::InsertAfter(PNODE pNode, TYPE newElement)
{
if (pNode!=NULL)
{
TNode* pNODE = (TNode*)pNode;
TNode* pNew = _NewNode(pNODE,pNODE->pNext);
if (pNew != NULL)
{
pNew->data = newElement;
if (pNew->pNext==NULL)
{
m_pNodeTail = pNew;
}
return pNew;
}
}
return NULL;
}
template<class TYPE>
inline PNODE CXList<TYPE>::Find(TYPE searchValue, PNODE pNode)
{
for (TNode* pIndex=m_pNodeHead; pIndex!=NULL; pIndex=pIndex->pNext)
{
if (pIndex->data==searchValue)
{
return pIndex;
}
}
return NULL;
}
template<class TYPE>
inline PNODE CXList<TYPE>::FindIndex(ULONG nIndex)
{
if (nIndex>=0 && nIndex<m_nCount)
{
TNode* pIndex = m_pNodeHead;
for (UINT i=0; i<nIndex && pIndex!=NULL; i++)
{
pIndex = pIndex->pNext;
}
return pIndex;
}
return NULL;
}