📄 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 + -