⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clist.h

📁 unix下的 Clist类实现
💻 H
字号:
/*
    Name                : CList
    Usage               : List Class
    begin               : 2001.12.08   
    version             : v3.0.0                                        
    copyright           : (C) 2001 by Nanjing Linkage System Integration CO.,LTD 
    email               : fangj@lianchuang.com
    user		: fangjian
    update		:                                
*/

#ifndef C_List__H
#define C_List__H

#include <stdio.h>

/*CC_CLEARNODE表示在将一个结点从列表中删除时,释放该结点的空间
  CC_NOCLEARNODE表示在将一个结点从列表中删除时,不释放该结点的空间*/
enum CLEARNODE_CONDITION{CC_CLEARNODE = 1, CC_NOCLEARNODE = 2};

/****************************************************************
 *
 *	Class:	CList
 *	Purpose:一个列表类,用于存放某一对象的列表,主要实现有
 *		增加对象、查找对象、得到对象以及将列表清空。
 *		
 ****************************************************************/


template<class CDataclass>
class CList{
	
private:
	/*列表头指针*/
	CDataclass* m_pCDataclassHead;
	
	/*列表尾指针*/		
	CDataclass* m_pCDataclassTail;	
	
	/*节点个数*/
	int m_iCount;

public:

	/*初始化列表为空*/
	CList();
	
	/*将列表释放*/		
	~CList();				

	/*得到列表中的头指针*/
	CDataclass* fnGetHead();

	/*将传入的结点指针从列表中删除
	如果iClearType为CC_CLEARNODE表示在将一个结点从列表中删除时,释放该结点的空间;
  	如果iClearType为CC_NOCLEARNODE表示在将一个结点从列表中删除时,不释放该结点的空间。
  	默认为CC_CLEARNODE*/
	void fnRemove(CDataclass*  data,int iClearNode = CC_CLEARNODE);
		
	/*将列表中所有的结点删除,并释放空间*/
	void fnRemoveAll();
		
	/*在列表尾加入数据,在将结点加入列表时,将结点的前后指针指向NULL,加入后,结点的前
	指针指向原列表的最后一个结点*/		
	void fnAdd(CDataclass* data);	
	
	/*得到列表下所挂结点的个数,返回值即列表中结点的个数。*/
	int fnGetListNum();

};


/****************************************************************
 *
 *	Function:CList
 *	Purpose:将列表头指针,列表当前指针,列表尾指针清空
 *	Return:	
 ****************************************************************/
template<class CDataclass>
CList<CDataclass>::CList()
{
	m_pCDataclassHead = NULL;
	m_pCDataclassTail = NULL;	
	m_iCount = 0;
}



/****************************************************************
 *
 *	Function:~CList
 *	Purpose:将列表清空,释放掉列表中所有的对象
 *	Return:	
 ****************************************************************/
template<class CDataclass>
CList<CDataclass>::~CList()
{

	fnRemoveAll();

}
/****************************************************************
 *
 *	Function:fnAdd
 *	Purpose:在列表尾增加一个对象的指针
 *	Return:	
 ****************************************************************/
template<class CDataclass>
void CList<CDataclass>::fnAdd(CDataclass* data)
{
	data->fnClearPoint();
	
	if(m_pCDataclassHead == NULL)
	{
		m_pCDataclassHead = data;
		m_pCDataclassTail = data;
	
	}
	else
	{
		m_pCDataclassTail->fnSetNext(data);
		data->fnSetPrev(m_pCDataclassTail);
		m_pCDataclassTail = data;
	}
	m_iCount++;
}

/****************************************************************
 *
 *	Function:fnGetHead
 *	Purpose:得到头指针
 *	Return:	
 ****************************************************************/
template<class CDataclass>
CDataclass* CList<CDataclass>::fnGetHead()
{
	return (CDataclass*)m_pCDataclassHead;
}

/****************************************************************
 *
 *	Function:fnRemove
 *	Purpose:将传入的结点指针从列表中删除,
 *		如果iClearType为CC_CLEARNODE表示在将一个结点从列表中删除时,释放该结点的空间;
 *	 	如果iClearType为CC_NOCLEARNODE表示在将一个结点从列表中删除时,不释放该结点的空间。
 *	Return:	
 ****************************************************************/
template<class CDataclass>
void CList<CDataclass>::fnRemove(CDataclass* data,int iClearNode)
{
	/*设置结点指针,用于存放前一个结点的指针和后一个结点的指针*/
	CDataclass* pCDataPrev;
	CDataclass* pCDataNext;


	/*将传入结点对象指针的前一个结点的指针赋给pCDataPrev。*/
	pCDataPrev = (CDataclass *)data->fnGetPrev();

	/*如果前一个结点为空,表明要删除的结点为头结点,需要将要删除结点的后一个结点置为头结点。*/
	if(pCDataPrev == NULL)
	{
		/*将要删除的结点的后一个指针赋给列表头指针*/
		m_pCDataclassHead = (CDataclass *)data->fnGetNext();
		/*如果还有节点存在*/
		if(m_pCDataclassHead!=NULL){
			/*将头指针的前一个结点置为空*/
			m_pCDataclassHead->fnSetPrev((CDataclass*)0);
		}else
		{/*空链表*/
			m_pCDataclassTail=NULL;
		}

		if(iClearNode == CC_CLEARNODE){
			/*将结点删除*/
			delete data;
		}

		m_iCount--;
		/*返回*/
		return;
	}

	/*将要删除结点的后一个结点指针赋给前一个结点的后一个指针*/
	pCDataPrev->fnSetNext(data->fnGetNext());
	
	/*将要删除结点的后一个结点指针赋给后一个结点*/
	pCDataNext = (CDataclass *)data->fnGetNext();

	/*如果后一个结点不为空,将前一个结点赋给其前一个结点的指针*/
	if(pCDataNext != NULL)
		pCDataNext->fnSetPrev(pCDataPrev);

	if(iClearNode == CC_CLEARNODE){
		/*将结点删除*/
		delete data;
	}

	m_iCount--;
	
	/*返回*/
	return;
}

/****************************************************************
 *
 *	Function:fnRemoveAll
 *	Purpose:将列表中所有的结点删除,并释放空间
 *	Return:	
 ****************************************************************/
template<class CDataclass>
void CList<CDataclass>::fnRemoveAll()
{

	CDataclass* pCDataclassTemp1;
	CDataclass* pCDataclassTemp2;
	
	/*将位置指针移到头指针*/
	pCDataclassTemp1 = m_pCDataclassHead;
	pCDataclassTemp2 = m_pCDataclassHead;
	
	/*逐一删除列表中的对象*/
	while(pCDataclassTemp1 != NULL)
	{
		pCDataclassTemp2 = (CDataclass *)pCDataclassTemp1->fnGetNext();
		delete pCDataclassTemp1;
		pCDataclassTemp1 = pCDataclassTemp2;
		
	}

	m_pCDataclassHead = NULL;
	m_pCDataclassTail = NULL;
	m_iCount=0;
}



/****************************************************************
 *
 *	Function:fnGetListNum
 *	Purpose:得到列表下所挂结点的个数
 *	Return:	结点的个数
 ****************************************************************/
template<class CDataclass>
int CList<CDataclass>::fnGetListNum()
{
	return m_iCount;
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -