有时候在内存里保存数据的时候需要一个带有当前指针的List用来知道当前位置,用数组又需要提前分配空间,因此是用循环链表是一个不错的选择。 //LoopList.h #ifndef LOOPLIST_H #define LOOPLIST_H template <class T> class LoopListNode { public: LoopListNode() { prevNode = 0; nextNode = 0; }; LoopListNode(const T& tValue) { prevNode = 0; nextNode = 0; data = tValue; } T data; LoopListNode* prevNode; LoopListNode* nextNode; }; template <class T> class LoopList { public: typedef LoopListNode<T> Node; typedef Node* PNode; LoopList() { m_head = new Node; m_head->prevNode = m_head; m_head->nextNode = m_head; m_begin = m_head; m_end = m_head; m_current = m_head; m_lCount = 0; } virtual ~LoopList() { ClearList(); if (m_head) { delete m_head; m_head = 0; } m_begin = 0; m_end = 0; m_current = 0; m_lCount = 0; } inline PNode head() { return m_head; } inline PNode begin() { return m_begin; } inline PNode end() { return m_end; } inline PNode current() { return m_current; } inline PNode moveBegin() { return m_current = m_begin; } inline PNode moveEnd() { return m_current = m_end; } inline PNode movePrev() { return m_current = m_current->prevNode; } inline PNode moveNext() { return m_current = m_current->nextNode; } inline LONG ListCount() { return m_lCount; } inline T& headData() { return m_head->data; } inline T& beginData() { return m_begin->data; } inline T& endData() { return m_end->data; } inline T& currentData() { return m_current->data; } inline BOOL notHead() { return m_current != m_head; } PNode item(UINT uiIndex) { PNode pNode = m_head; while (uiIndex) { pNode = pNode->nextNode; uiIndex--; } return pNode; } inline T& operator [] (UINT uiIndex) { return item(uiIndex)->data; } PNode appendNode(const Node& node, PNode pPrevNode = 0) { PNode pNode = (PNode)&node; if (!pNode) { return NULL; } if (!pPrevNode) { pPrevNode = m_end; } PNode pNewNode = new Node(*pNode); pNewNode->nextNode = pPrevNode->nextNode; pPrevNode->nextNode->prevNode = pNewNode; pPrevNode->nextNode = pNewNode; pNewNode->prevNode = pPrevNode; if (pNewNode->prevNode == m_head) { m_begin = pNewNode; } if (pNewNode->nextNode == m_head) { m_end = pNewNode; } m_lCount++; return pNewNode; } PNode appendNode(PNode pNode, PNode pPrevNode = 0) { if (!pNode) { return NULL; } if (!pPrevNode) { pPrevNode = m_end; } PNode pNewNode = pNode; pNewNode->nextNode = pPrevNode->nextNode; pPrevNode->nextNode->prevNode = pNewNode; pPrevNode->nextNode = pNewNode; pNewNode->prevNode = pPrevNode; if (pNewNode->prevNode == m_head) { m_begin = pNewNode; } if (pNewNode->nextNode == m_head) { m_end = pNewNode; } m_lCount++; return pNewNode; } PNode appendNode(T data, PNode pPreNode = 0) { PNode pNode = new Node; pNode->data = data; return appendNode(pNode, pPreNode); } PNode preAppendNode(const Node& node, PNode pNextNode = 0) { PNode pNode = (PNode)&node; if (!pNode) { return NULL; } if (!pNextNode) { pNextNode = m_begin; } PNode pNewNode = new Node(*pNode); pNewNode->prevNode = pNextNode->prevNode; pNextNode->prevNode->nextNode = pNewNode; pNewNode->nextNode = pNextNode; pNextNode->prevNode = pNewNode; if (pNewNode->prevNode == m_head) { m_begin = pNewNode; } if (pNewNode->nextNode == m_head) { m_end = pNewNode; } m_lCount++; return pNewNode; } PNode preAppendNode(PNode pNode, PNode pNextNode = 0) { if (!pNode) { return NULL; } if (!pNextNode) { pNextNode = m_begin; } PNode pNewNode = pNode; pNewNode->prevNode = pNextNode->prevNode; pNextNode->prevNode->nextNode = pNewNode; pNewNode->nextNode = pNextNode; pNextNode->prevNode = pNewNode; if (pNewNode->prevNode == m_head) { m_begin = pNewNode; } if (pNewNode->nextNode == m_head) { m_end = pNewNode; } m_lCount++; return pNewNode; } PNode preAppendNode(T data, PNode pNextNode = 0) { PNode pNode = new Node; pNode->data = data; return preAppendNode(pNode, pNextNode); } PNode removeNode(PNode pNode = 0) { if (!pNode) { pNode = m_current; } if (pNode == m_head) { return m_head; } PNode retNode = 0; if (m_current == pNode) { if (m_current == m_end) { m_current = pNode->prevNode; } else { m_current = pNode->nextNode; } retNode = m_current; } else { if (pNode == m_end) { retNode = pNode->prevNode; } else { retNode = pNode->nextNode; } } pNode->prevNode->nextNode = pNode->nextNode; if (m_end == pNode) { m_end = pNode->prevNode; } pNode->nextNode->prevNode = pNode->prevNode; if (m_begin == pNode) { m_begin = pNode->nextNode; } delete pNode; m_lCount--; return retNode; } virtual void ClearList() { for (moveBegin(); current() != head(); ) { removeNode(); } m_begin = m_head; m_end = m_head; m_current = m_head; m_lCount = 0; } protected: PNode m_head; PNode m_begin; PNode m_end; PNode m_current; LONG m_lCount; }; #endif 调用方法举例: typedef LoopList<CString> StringList; StringList strList; CString strTemp; //初始化 for (int i = 0; i < 100 i++) { strTemp.Format(_T("This is No. %d string!"), i); strList.appendNode(strTemp); } //便利 StringList::PNode pFindNode = 0; for (strList.moveBegin(); strList.notHead(); strList.moveNext) { if (strList.currentData() == _T("This is No. 50 string!")) { pFindNode = strList.current(); break; } } //删除节点 strList.removeNode(pFindNode); //清空链表 if (strList.ListCount()) { strList.ClearList(); }