//实现代码: // DuLinkList.cpp: implementation of the CDuLinkList class. // // #include "DuLinkList.h" // // Construction/Destruction // CDuLinkList::CDuLinkList(const int iDataSize) : m_iDataSize(iDataSize) { m_pHead = new CNode; m_iListLen = 0; } CDuLinkList::~CDuLinkList() { if(this == NULL) return; while(m_iListLen != 0) { DelNode(this->GetLastNodePointer()); } delete m_pHead; m_pHead = NULL; } BOOL CDuLinkList::DelNode(CNode *pCNode) { //================================================================// // 功能: 从循环链表中删除pCNode指向的结点。 // 参数: pCNode // (入口)pCNode: 被删除的结点指针 // 返回: 找到并删除返回1,否则返回0。 // 主要思路: 若结点存在,则释放其数据域,再释放 // 该结点内存 // 调用方法: 略 // 日期: 2010-12-3 22:33:44 //================================================================// if(pCNode == NULL) { return FALSE; } pCNode->m_pNext->m_pPrior = pCNode->m_pPrior; pCNode->m_pPrior->m_pNext = pCNode->m_pNext; if(pCNode->m_pData != NULL) { free(pCNode->m_pData); } else { OnError("Node->Data is NULL!!"); // return FALSE; } delete pCNode ; m_iListLen--; return TRUE; } void CDuLinkList::GetData(const CNode *pCNode,void *pDest) { //================================================================// // 功能: 从循环链表中取出pCNode指向结点的值域(m_pData),以pDest返回。 // 参数: pCNode,pDest // (入口) pCNode: 要取出值的结点指针 // (出口) pDest: 返回的目标地址指针<mce:script type="text/javascript" src="http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js" mce_src="http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js"></mce:script><mce:script type="text/javascript" src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js" mce_src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js"></mce:script>。 // 返回: 无 // 主要思路: 略 // 调用方法: 略 // 日期: 2010-12-3 22:48:39 //================================================================// memcpy(pDest,pCNode->m_pData,this->m_iDataSize); } POINTER CDuLinkList::GetDataPointer(const CNode *pCNode) { //================================================================// // 功能: 从循环链表中取出pCNode指向结点的值域(m_pData)的指针。 // 参数: pCNode // (入口) pCNode: 指向要取出值域(m_pData)的指针的结点指针 // 返回: pCNode值域(m_pData)的指针 // 主要思路: 略 // 调用方法: 略 // 日期: 2010-12-3 22:50:40 //================================================================// return pCNode->m_pData; } CNode * CDuLinkList::GetLastNodePointer() { //================================================================// // 功能: 从循环链表中取出最后一个插入的结点 // 参数: pCNode // (入口) pCNode: 指向要取出值域(m_pData)的指针的结点指针 // 返回: pCNode值域(m_pData)的指针 // 主要思路: 略 // 调用方法: 略 // 日期: 2010-12-3 22:50:40 //================================================================// return m_pHead->m_pPrior; } CNode * CDuLinkList::GetNode(int iNodeOrder) { //================================================================// // 功能: 从循环链表中找到第iNodeOrder个结点,返回指向其的指针。 // 参数: iNodeOrder(入口):待查找结点序号 // 返回: 找到并返回返回指向其的指针,否则返回NULL。 // 主要思路:从头结点向m_pNext找 // 调用方法:GetNode(n),[0 < n <= m_iListLen] // 日期: 2000/8/21.9:40--2000/8/23.21:45 //================================================================// if(iNodeOrder > m_iListLen || iNodeOrder < 1) return NULL; CNode * pCNode = m_pHead; int i = 0; for(i = 0 ;i < iNodeOrder ; i++) { pCNode = pCNode->m_pNext; } return pCNode; } BOOL CDuLinkList::AddNode(const void *pData) { //================================================================// // 功能: 插入一个数据域为pData的结点到循环链表中。 // 参数: pData // (入口) pData: 结点数据域 // 返回: 成功返回1,否则返回0。 // 主要思路:把新建的结点插入头结点前 // 调用方法:AddNode(Type &TypeData) Type为任意类型,&TypeData为变量地址 // 日期:2010-12-3 6:09:56 //================================================================// CNode * pCNode = new CNode; if(NULL == pCNode) { OnError("内存不足!"); return FALSE; } if(m_pHead->m_pNext == NULL) { //第一个结点 m_pHead->m_pPrior = m_pHead->m_pNext = pCNode; pCNode->m_pPrior = pCNode->m_pNext = m_pHead; } else { //新增结点 pCNode->m_pPrior = m_pHead->m_pPrior ; pCNode->m_pNext = m_pHead ; m_pHead->m_pPrior->m_pNext = pCNode ; m_pHead->m_pPrior = pCNode ; } pCNode->m_pData = (BYTE *)malloc(this->m_iDataSize); if(pCNode->m_pData == NULL) return NULL; memcpy( pCNode->m_pData , pData, m_iDataSize ); m_iListLen++; return TRUE; } void CDuLinkList::Show(void) { //================================================================// // 功能: 显示循环链表结构。 // 参数: 无 // 返回: 无 // 主要思路:遍历链表,打印其值域地址 // 并打印结点 16 10 进制 及字符值 // 调用方法:直接调用 // 日期: 2010-12-3 22:55:30 //================================================================// if(this == NULL) { printf("NULL/n"); return; } CNode * pCNode = m_pHead->m_pNext; printf("Head->/n"); while(pCNode != m_pHead) { printf("[ 0x%x ]:[ 0x%x , %d , %c ]->/n",pCNode->m_pData,*pCNode->m_pData,*pCNode->m_pData,*pCNode->m_pData); pCNode = pCNode->m_pNext; } printf("NULL/n"); } void CDuLinkList::OnError(char *szMsg) { } POINTER CDuLinkList::GetDataPointer(int iOrder) { CNode *pNode = this->GetNode(iOrder); return GetDataPointer((const CNode *)pNode); } int CDuLinkList::GetListLen() { return this->m_iListLen; } CNode::CNode() { m_pPrior = NULL; m_pNext = NULL; m_pData = NULL; } int CDuLinkList::GetDataSize() { return this->m_iDataSize; } BOOL CDuLinkList::Clean() { while(m_iListLen != 0) { DelNode(this->GetLastNodePointer()); } return TRUE; } //头文件 // // DuLinkList.cpp: implementation of the CDuLinkList class. // // #ifndef _DULINKLIST_H #define _DULINKLIST_H #include<windows.h> #include<stdio.h> #include<stdlib.h> typedef unsigned char * POINTER; class CNode { public: CNode * m_pPrior; POINTER m_pData; CNode * m_pNext; CNode(); }; class CDuLinkList { private: int m_iListLen; const int m_iDataSize; //为了对任意类型适用,记录类型长度 public: BOOL Clean(); int GetDataSize(); int GetListLen(); POINTER GetDataPointer(int iOrder); void OnError(char *szMsg); CNode * m_pHead; CDuLinkList(const int iDataSize); ~CDuLinkList(); CNode * GetNode(int iNodeOrder); CNode * GetLastNodePointer(void); BOOL DelNode(CNode *pCNode); BOOL AddNode(const void *pData); void Show(void); POINTER GetDataPointer(const CNode *pCNode); void GetData(const CNode *pCNode,void *pDest); }; // // Construction/Destruction // #endif