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

📄 hlist.h

📁 积下的一点C++编程序库源码
💻 H
字号:
// HList.h: interface for the CHList class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_LASSLIST_H__F9E6BA57_E122_4002_B6B7_B265D6ABA007__INCLUDED_)
#define AFX_LASSLIST_H__F9E6BA57_E122_4002_B6B7_B265D6ABA007__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
//////////////////////////////////////////////////////////////////////////////


//文件名		: HList.h

//功能			: 链表模板

//创建			: 2003.11.27

//修改日期		: 2004.4.5

//作者			: 韩国静
//
#include "public/UniType.h"
//本模板提供了一个链表,可以做为队列来使用,也可以作为普通链表使用

template <class ClassType>
class CHList
{
	struct ClassChain{
		ClassChain *pNext;
		ClassType   Node;
	}*m_First;

public:
	typedef ClassType NODETYPE;
	typedef void *  HLISTPOSTION;
	//////////////构造与析构///////////////////////
	CHList()		{m_First=0;};
	~CHList()	{EmptyAll();};
	/////////////////////////////////////

	//从链表中删除一个节点
	bool Remove(NODETYPE *pClass);

	//在链表头添加一个新节点
	NODETYPE *AddHead();

	//在链表尾添加一个新节点
	NODETYPE *AddTail();

	//删除链表中全部节点
	bool EmptyAll();

	//得到链表长度
	unsigned int GetCount();
	//得到存储在链表中的下一个节点内存指针,反复调用可以访问链表所有节点
	NODETYPE *MoveToNext(HLISTPOSTION & pPos);

	//获取链表首位置,用于GetNextOne访问链表所有节点
	HLISTPOSTION MoveToBegin(){return (HLISTPOSTION)m_First;};

	NODETYPE *GetCurNode(HLISTPOSTION  pPos)
	{
		return pPos?(&(((ClassChain *)pPos)->Node)):UNI_NULL;
	}

	////////////////////////////////////////////
};

//得到存储在链表中的一个节点内存指针
template<class ClassType>
ClassType *CHList<ClassType>::MoveToNext(HLISTPOSTION &pPos)
{
	ClassChain *pCur;
	ClassType *pTemp=UNI_NULL;
	if(pPos)
	{
		pCur=(ClassChain *)pPos;
		pTemp=&pCur->Node;
		pPos=(void *)pCur->pNext;
	}
	return pTemp;
}

//得到链表长度
template<class ClassType>
unsigned int 	CHList<ClassType>::GetCount()
{
	ClassChain *pTemp;
	unsigned int dwCount=0;
	pTemp=m_First;
	while(pTemp!=0)
	{
		dwCount++;
		pTemp=pTemp->pNext;
	}
	return dwCount;
}

//从链表中删除一个节点
template<class ClassType> 
bool CHList<ClassType>::Remove(ClassType *pClass)
{
	ClassChain *pTemp,*pPre;
	/////////////////////////////////////////////////////
	if(pTemp=m_First)
	{
		pPre=0;
		while(pTemp)
		{
			if(&pTemp->Node==pClass)
			{
				break;
			}
			pPre=pTemp;
			pTemp=pTemp->pNext;
		}
		if(pTemp)
		{
			if(pPre==0)
			{
				m_First=pTemp->pNext;
			}
			else
			{
				pPre->pNext=pTemp->pNext;
			}
			delete pTemp;
			return true;
		}
	}
	return false;
}

//在链表头添加一个新节点
template <class ClassType>
ClassType *CHList<ClassType>::AddHead()
{
	ClassChain *pUser;
	pUser=new ClassChain;
	if(pUser)
	{
		pUser->pNext=m_First;
		m_First=pUser;
		return &(pUser->Node);
	}
	return 0;
}

//在链表尾添加一个新节点
template <class ClassType>
ClassType *CHList<ClassType>::AddTail()
{
	ClassChain *pUser,*pTemp;
	pUser=new ClassChain;
	if(pUser)
	{
		pUser->pNext=0;
		if(pTemp=m_First)
		{
			while(pTemp->pNext!=0)
				pTemp=pTemp->pNext;
			pTemp->pNext=pUser;

		}
		else
		{
			m_First=pUser;
		}
		return &(pUser->Node);
	}
	return 0;
}

//删除链表中全部节点
template <class ClassType> 
bool CHList<ClassType>:: EmptyAll()
{
	ClassChain *pTemp;
	/////////////////////////////////////////////////////
	while(m_First)
	{
		pTemp=m_First;
		m_First=m_First->pNext;
		delete pTemp;
	}
	//////////////////////////////////
	return true;
}

#endif // !defined(AFX_LASSLIST_H__F9E6BA57_E122_4002_B6B7_B265D6ABA007__INCLUDED_)

⌨️ 快捷键说明

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