www.pudn.com > GameEngine_src.rar > CList.h
#ifndef CList_h #define CList_h //#includetemplate struct CListNode { type obj; CListNode *pPrev; CListNode *pNext; public: CListNode() { pPrev = 0; pNext = 0; } ~CListNode(){} }; ///////////////////////////////////////////////////////////////////////////////// //链表类模板 ///////////////////////////////////////////////////////////////////////////////// template class CList { private: CListNode *m_pHead; int m_size; public: //迭代器 class Iterator { private: CListNode *m_pCur; CListNode m_TempNode; //临时节点,用于删除 public: Iterator(){ m_pCur=0; } Iterator( CListNode * p ) { m_pCur = p; } ~Iterator(){}; CListNode *GetCur() { return m_pCur; } type &operator *() { return m_pCur->obj; } void operator = ( CListNode *p ) { m_pCur = p;} bool operator != ( CListNode *p ) {return m_pCur != p;} void operator++(){m_pCur = m_pCur->pNext;} void OnDelete(){ m_TempNode.pNext = m_pCur->pNext; m_pCur = &m_TempNode; } }; private: //删除一个节点 void DeleteHelp( CListNode *pNode ) { if ( pNode ) { CListNode *pPrev = pNode->pPrev; CListNode *pNext = pNode->pNext; if ( pNext ) pNext->pPrev = pPrev; if ( pPrev ) pPrev->pNext = pNext; else m_pHead = pNext; delete pNode; m_size--; } } public: //默认构造 CList() { m_pHead = 0; m_size = 0; } //析构 ~CList() { Clear(); } //获取节点个数 int GetLength() { return m_size; } //创建一个节点 type *CreateOneNode() { CListNode *pNew = new CListNode ; if ( pNew ) { pNew->pNext = m_pHead; if ( m_pHead ) m_pHead->pPrev = pNew; m_pHead = pNew; m_size++; } return (type *)pNew; } //增加一个对象 type *Add( const type &t ) { CListNode *pNew = new CListNode ; if ( pNew ) { pNew->pNext = m_pHead; if ( m_pHead ) m_pHead->pPrev = pNew; m_pHead = pNew; m_size++; *((type *)pNew) = t; } return (type *)pNew; } //删除迭代器指向的节点 void Delete( Iterator &it ) { CListNode *pNode = it.GetCur(); it.OnDelete(); DeleteHelp( pNode ); } //删除对象 void Delete( type *pObj ) { DeleteHelp( (CListNode *)pObj ); } //选代开始 CListNode *Begin() { return m_pHead; } //选代结束 CListNode *End() { return 0; } //释放所有节点 void Clear() { while ( m_pHead ) DeleteHelp( m_pHead ); } }; #endif