KList(基于 LinkedList 实现)

KList.h

cpp 复制代码
#ifndef	_ENGINE_KLLIST_H_
#define	_ENGINE_KLLIST_H_ 1

//---------------------------------------------------------------------------
#include "KNode.h"
//---------------------------------------------------------------------------

class KList
{
public:
	KNode	m_ListHead;		// 头节点(不是第一个节点)
	KNode	m_ListTail;		// 尾节点(不是最后的节点)
public:
	KList();
	KNode*	GetHead();		// 取得第一个节点
	KNode*	GetTail();		// 取得最后一个节点
	void AddHead(KNode *pNode); // 在最前面增加一个节点
	void AddTail(KNode *pNode); // 在最后面增加一个节点
	KNode*	RemoveHead();	// 删除第一个节点
	KNode*	RemoveTail();	// 删除最后一个节点
	int		IsEmpty();		// 是否是个空的链表
	long	GetNodeCount();
};
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 函数:	KList
// 功能:	构造
inline KList::KList()
{
	m_ListHead.m_pNext = &m_ListTail;
	m_ListTail.m_pPrev = &m_ListHead;
}

//-------------------------------------------------------------------------
// 函数:	IsEmpty
// 功能:	是否为空
// 返回:	int
inline int KList::IsEmpty()
{
	return (m_ListHead.GetNext() == NULL);
}
//-------------------------------------------------------------------------
// 函数:	GetHead
// 功能:	取得链表的头
// 返回:	KNode*
//---------------------------------------------------------------------------
inline KNode* KList::GetHead()
{
	return m_ListHead.GetNext();
}
//-------------------------------------------------------------------------
// 函数:	GetTail
// 功能:	取得链表的尾
// 返回:	KNode*
//---------------------------------------------------------------------------
inline KNode* KList::GetTail()
{
	return m_ListTail.GetPrev();
}
//-------------------------------------------------------------------------
// 函数:	AddHead
// 功能:	在头部增加一个节点
// 参数:	KNode*
// 返回:	int
//---------------------------------------------------------------------------
inline void KList::AddHead(KNode *pNode)
{
	m_ListHead.InsertAfter(pNode);
}
//-------------------------------------------------------------------------
// 函数:	AddTail
// 功能:	在末尾增加一个节点
// 参数:	KNode*
//---------------------------------------------------------------------------
inline void KList::AddTail(KNode *pNode)
{
	m_ListTail.InsertBefore(pNode);
}
//-------------------------------------------------------------------------
// 函数:	RemoveHead
// 功能:	删除第一个节点
// 返回:	KNode*
//---------------------------------------------------------------------------
inline KNode* KList::RemoveHead()
{
	KNode* pNode = m_ListHead.GetNext();
	if (pNode)
		pNode->Remove();
	return pNode;
}
//-------------------------------------------------------------------------
// 函数:	RemoveTail
// 功能:	删除最后一个节点
// 返回:	KNode*
//---------------------------------------------------------------------------
inline KNode* KList::RemoveTail()
{
	KNode* pNode = m_ListTail.GetPrev();
	if (pNode)
		pNode->Remove();
	return pNode;
}
//-------------------------------------------------------------------------
// 函数:	GetNodeCount
// 功能:	取得节点个数
// 返回:	long
//---------------------------------------------------------------------------
inline long KList::GetNodeCount()
{
	long nNode = 0;
	KNode* pNode = GetHead();
	while (pNode)
	{
		pNode = pNode->GetNext();
		nNode++;
	}
	return nNode;
}
//-------------------------------------------------------------------------

#endif	//_ENGINE_KLLIST_H_

KNode.h

cpp 复制代码
#ifndef	_ENGINE_KNODE_H_
#define	_ENGINE_KNODE_H_ 1
#include "KGPublic.h"
#pragma warning(disable: 4275)
#pragma warning(disable: 4251)

class KNode
{
public:
	KNode* m_pNext;
	KNode* m_pPrev;

public:
	KNode();
	virtual ~KNode(){};
	KNode*	GetNext();
	KNode*	GetPrev();
	void	InsertBefore(KNode* pNode);
	void	InsertAfter(KNode* pNode);
	void	Remove();
	int		IsLinked();
};
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 函数:	Knode
// 功能:	构造
//---------------------------------------------------------------------------
inline KNode::KNode()
{
	m_pNext = NULL;
	m_pPrev = NULL;
}
//---------------------------------------------------------------------------
// 函数:	GetNext
// 功能:	下一个结点
// 返回:	KNode*
//---------------------------------------------------------------------------
inline KNode* KNode::GetNext()
{
	if (m_pNext && m_pNext->m_pNext)
		return m_pNext;
	return NULL;
}
//---------------------------------------------------------------------------
// 函数:	GetPrev
// 功能:	前一个结点
// 返回:	KNode*
//---------------------------------------------------------------------------
inline KNode* KNode::GetPrev()
{
	if (m_pPrev && m_pPrev->m_pPrev)
		return m_pPrev;
	return NULL;
}
//----------------------------------------------------------------------------
// 函数:	InsertBefore
// 功能:	在前面插入一个结点
// 参数:	KNode*
//---------------------------------------------------------------------------
inline void KNode::InsertBefore(KNode *pNode)
{
	ASSERT(m_pPrev);
	if (!pNode || !m_pPrev)
		return;

	if(pNode->m_pNext || pNode->m_pPrev)
	{
		ASSERT(0);
	}

	pNode->m_pPrev = m_pPrev;
	pNode->m_pNext = this;
	m_pPrev->m_pNext = pNode;
	m_pPrev = pNode;
}
//---------------------------------------------------------------------------
// 函数:	InsertAfter
// 功能:	在后面插入一个结点
// 参数:	KNode*
//---------------------------------------------------------------------------
inline void KNode::InsertAfter(KNode *pNode)
{
	ASSERT(m_pNext);
	if (!pNode || !m_pNext)
		return;
	pNode->m_pPrev = this;
	pNode->m_pNext = m_pNext;
	m_pNext->m_pPrev = pNode;
	m_pNext = pNode;
}
//---------------------------------------------------------------------------
// 函数:	Remove the node
// 功能:	删除这个结点
// 返回:	KNode*
//---------------------------------------------------------------------------
inline void KNode::Remove()
{
	ASSERT(m_pPrev);
	ASSERT(m_pNext);
	if (m_pPrev)
		m_pPrev->m_pNext = m_pNext;
	if (m_pNext)
		m_pNext->m_pPrev = m_pPrev;
	m_pPrev = NULL;
	m_pNext = NULL;
}
//---------------------------------------------------------------------------
// 函数:	IsLinked
// 功能:	这个节点是否链接
// 返回:	bool
//---------------------------------------------------------------------------
inline int KNode::IsLinked()
{
	return (m_pPrev && m_pNext);
}
//--------------------------------------------------------------------------------

#endif	//_ENGINE_KNODE_H_
相关推荐
Mem0rin10 分钟前
[Java/数据结构]线性表之链表
java·数据结构·链表
笨笨饿16 分钟前
26_为什么工程上必须使用拉普拉斯变换
c语言·开发语言·人工智能·嵌入式硬件·机器学习·编辑器·概率论
酉鬼女又兒25 分钟前
零基础快速入门前端ES6 核心特性详解:Set 数据结构与对象增强写法(可用于备赛蓝桥杯Web应用开发)
开发语言·前端·javascript·职场和发展·蓝桥杯·es6
kyle~33 分钟前
ROS2 --- WaitSet(等待集) 等待实体就绪,管理执行回调函数
大数据·c++·机器人·ros2
人大博士的交易之路41 分钟前
数据结构算法——python数据结构
开发语言·数据结构·python
Han_han91944 分钟前
面向对象高级 继承(extends):
开发语言·python
量子炒饭大师1 小时前
【C++进阶】Cyber骇客的赛博血统上传——【面向对象之 继承 】一文带你搞懂面向对象编程的三要素之————继承
c++·dubbo·继承·面向对象编程
前端老石人1 小时前
邂逅前端开发:从基础到实践的全景指南
开发语言·前端·html
Tanecious.1 小时前
蓝桥杯备赛:Day2-B3612 求区间和
c++·蓝桥杯