www.pudn.com > GameEngine_src.rar > CList.h


#ifndef CList_h 
#define CList_h 
//#include  
 
template  
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