C++模板-双向链表
2010-05-26 22:09
274 查看
直接挂代码了,写双向链表没出啥问题
/************************************************************************
* 文 件 名: DoubliList.h
* 文件描述: 模板双向链表头文件
* 创 建 人: Toony, 2010-05-26
* 版 本 号: V1.0.0
* 修改记录: 无
************************************************************************/
#ifndef NULL
#define NULL 0
#endif
typedef unsigned int UNINT;
/************************************************************************
* 类 名: CNode
* 类 描 述: CDoubleList用节点类
* 创 建 人: Toony, 2010-05-26
************************************************************************/
template <typename DataType>
class CNode
{
public:
CNode();
~CNode();
DataType data;
CNode *lpNext;
CNode *lpPre;
};
//*=======================================================================
//* 函 数 名: CNode<DataType>::CNode()
//* 功能描述: 构造函数
//* 参 数: 无
//*
//* 抛出异常: 无
//*
//* 返 回 值: 无
//* 作 者: Toony, 2010-05-26
//=======================================================================*/
template <typename DataType>
CNode<DataType>::CNode()
{
lpNext = lpPre = NULL;
}
//*=======================================================================
//* 函 数 名: CNode<DataType>::~CNode()
//* 功能描述: 析构函数
//* 参 数: 无
//*
//* 抛出异常: 无
//*
//* 返 回 值: 无
//* 作 者: Toony, 2010-05-26
//=======================================================================*/
template <typename DataType>
CNode<DataType>::~CNode()
{
}
/************************************************************************
* 类 名: CDoubleList
* 类 描 述: 模板双向链表类
* 创 建 人: Toony, 2010-05-26
************************************************************************/
template <typename DataType>
class CDoubleList
{
public:
CDoubleList();
~CDoubleList();
int Insert(DataType m_newNode);
int Insert(UNINT nwIndex, DataType newNode);
void Delete(UNINT nwIndex);
void DeleteAll();
void DeleteLast();
DataType &GetAt(UNINT nwIndex);
void SetAt(UNINT nwIndex, DataType newNode);
size_t GetLength();
private:
size_t nwLength;
CNode<DataType> *lpHead;
CNode<DataType> *lpTail;
};
//*=======================================================================
//* 函 数 名: CDoubleList<DataType>::CDoubleList()
//* 功能描述: 构造函数
//* 参 数: 无
//*
//* 抛出异常: 无
//*
//* 返 回 值: 无
//* 作 者: Toony, 2010-05-26
//=======================================================================*/
template <typename DataType>
CDoubleList<DataType>::CDoubleList()
{
lpHead = lpTail = NULL;
nwLength = 0;
}
//*=======================================================================
//* 函 数 名: CDoubleList<DataType>::~CDoubleList()
//* 功能描述: 析构函数
//* 参 数: 无
//*
//* 抛出异常: 无
//*
//* 返 回 值: 无
//* 作 者: Toony, 2010-05-26
//=======================================================================*/
template <typename DataType>
CDoubleList<DataType>::~CDoubleList()
{
DeleteAll();
}
//*=======================================================================
//* 函 数 名: int CDoubleList<DataType>::Insert(DataType newNode)
//* 功能描述: 向链表追加节点
//* 参 数: <DataType> newNode - 插入节点的数据
//*
//* 抛出异常: 无
//*
//* 返 回 值: 0 - 失败
//* 1 - 成功
//* 作 者: Toony, 2010-05-26
//=======================================================================*/
template <typename DataType>
int CDoubleList<DataType>::Insert(DataType newNode)
{
CNode<DataType> *lpNewNode = new CNode<DataType>;
if (lpNewNode == NULL)
return 0;
lpNewNode->data = newNode;
if (lpHead == NULL)
lpHead = lpNewNode;
else if (lpTail != NULL)
lpTail->lpNext = lpNewNode;
lpNewNode->lpPre = lpTail;
lpTail = lpNewNode;
++ nwLength;
return 1;
}
//*=======================================================================
//* 函 数 名: int CDoubleList<DataType>::Insert(UNINT nwIndex, DataType newNode)
//* 功能描述: 向指定位置插入节点,若nwIndex不存在,则向链表追加节点
//* 参 数: UNINT nwIndex - 插入节点位置,从0开始.
//* <DataType> newNode - 插入节点的数据
//*
//* 抛出异常: 无
//*
//* 返 回 值: 0 - 失败
//* 1 - 成功
//* 作 者: Toony, 2010-05-26
//=======================================================================*/
template <typename DataType>
int CDoubleList<DataType>::Insert(UNINT nwIndex, DataType newNode)
{
if (nwIndex >= nwLength)
return Insert(newNode);
CNode<DataType> *lpTemp, *lpNewNode;
lpTemp = lpHead;
lpNewNode = new CNode<DataType>;
if (lpNewNode == NULL)
return 0;
lpNewNode->data = newNode;
for (UNINT nI = 0; nI < nwIndex && lpTemp->lpNext; nI ++)
lpTemp = lpTemp->lpNext;
if (lpTemp->lpPre == NULL) /*在头部插入节点*/
{
lpNewNode->lpNext = lpHead;
lpHead = lpNewNode;
}
else /*在中间插入节点*/
{
lpTemp->lpPre->lpNext = lpNewNode;
lpNewNode->lpPre = lpTemp->lpPre;
lpNewNode->lpNext = lpTemp;
lpTemp->lpPre = lpNewNode;
}
++ nwLength;
return 1;
}
//*=======================================================================
//* 函 数 名: void CDoubleList<DataType>::DeleteAll()
//* 功能描述: 删除所有节点
//* 参 数: 无
//*
//* 抛出异常: 无
//*
//* 返 回 值: 无
//* 作 者: Toony, 2010-05-26
//=======================================================================*/
template <typename DataType>
void CDoubleList<DataType>::DeleteAll()
{
if (lpHead == NULL)
return;
CNode<DataType> *lpTemp;
while (lpHead)
{
lpTemp = lpHead->lpNext;
delete lpHead;
lpHead = lpTemp;
}
lpHead = lpTail = NULL;
nwLength = 0;
}
//*=======================================================================
//* 函 数 名: size_t CDoubleList<DataType>::GetLength()
//* 功能描述: 返回当前链表长度
//* 参 数: 无
//*
//* 抛出异常: 无
//*
//* 返 回 值: size_t - 链表长度
//* 作 者: Toony, 2010-05-26
//=======================================================================*/
template <typename DataType>
size_t CDoubleList<DataType>::GetLength()
{
return nwLength;
}
//*=======================================================================
//* 函 数 名: size_t CDoubleList<DataType>::Delete(UNINT nwIndex)
//* 功能描述: 删除链表中的指定节点,若nwIndex不存在,则删除尾节点
//* 参 数: UNINT nwIndex - 即将删除的节点下标,从0开始.
//*
//* 抛出异常: 无
//*
//* 返 回 值: 无
//* 作 者: Toony, 2010-05-26
//=======================================================================*/
template <typename DataType>
void CDoubleList<DataType>::Delete(UNINT nwIndex)
{
if (lpHead == NULL)
return;
if (nwIndex >= nwLength - 1)
return DeleteLast();
CNode<DataType> *lpTemp;
lpTemp = lpHead;
for (UNINT nI = 0; nI < nwIndex && lpTemp->lpNext; nI ++)
lpTemp = lpTemp->lpNext;
if (lpTemp->lpPre == NULL) /*删除头结点 (已保证该结点不是尾节点)*/
{
lpHead = lpHead->lpNext;
lpHead->lpPre = NULL;
}
else /*删除中间节点 (已保证该结点不是尾节点) */
{
lpTemp->lpPre->lpNext = lpTemp->lpNext;
lpTemp->lpNext->lpPre = lpTemp->lpPre;
}
delete lpTemp;
-- nwLength;
}
//*=======================================================================
//* 函 数 名: void CDoubleList<DataType>::DeleteLast()
//* 功能描述: 删除链表中最后一个节点
//* 参 数: 无
//*
//* 抛出异常: 无
//*
//* 返 回 值: 无
//* 作 者: Toony, 2010-05-26
//=======================================================================*/
template <typename DataType>
void CDoubleList<DataType>::DeleteLast()
{
if (lpTail == NULL)
return;
if (lpTail == lpHead /*<=> lpTail->lpPre == NULL <=> nwLength == 1 */)
{
delete lpHead; /*删除唯一节点 (该节点既是头结点又是尾节点)*/
lpHead = lpTail = NULL;
}
else
{
lpTail = lpTail->lpPre;
delete lpTail->lpNext;
lpTail->lpNext = NULL;
}
-- nwLength;
}
//*=======================================================================
//* 函 数 名: DataType &CDoubleList<DataType>::GetAt(UNINT nwIndex)
//* 功能描述: 返回链表中指定节点的数据,若nwIndex不存在,则返回尾节点的数据
//* 参 数: UNINT nwIndex - 要返回的节点下标,从0开始
//*
//* 抛出异常: 无
//*
//* 返 回 值: <DataType> - 节点数据
//* 作 者: Toony, 2010-05-26
//=======================================================================*/
template <typename DataType>
DataType &CDoubleList<DataType>::GetAt(UNINT nwIndex)
{
if (nwIndex == 0)
return lpHead->data;
if (nwIndex == nwLength - 1)
return lpTail->data;
CNode<DataType> *lpTemp;
lpTemp = lpHead;
for (UNINT nI = 0; nI < nwIndex && lpTemp->lpNext; nI ++)
lpTemp = lpTemp->lpNext;
return lpTemp->data;
}
//*=======================================================================
//* 函 数 名: void CDoubleList<DataType>::SetAt(UNINT nwIndex, DataType newNode)
//* 功能描述: 修改链表中指定下标的数据,若nwIndex不存在,则修改尾节点的数据
//* 参 数: UNINT nwIndex - 要修改的节点的下标,从0开始
//* <DataType> newNode - 要修改的节点的数据
//*
//* 抛出异常: 无
//*
//* 返 回 值: 无
//* 作 者: Toony, 2010-05-26
//=======================================================================*/
template <typename DataType>
void CDoubleList<DataType>::SetAt(UNINT nwIndex, DataType newNode)
{
if (lpHead == NULL)
return;
CNode<DataType> *lpTemp;
lpTemp = lpHead;
if (nwIndex == nwLength - 1)
lpTemp = lpTail;
else
for (UNINT nI = 0; nI < nwIndex && lpTemp->lpNext; nI ++)
lpTemp = lpTemp->lpNext;
lpTemp->data = newNode;
}
/************************************************************************
* 文 件 名: DoubliList.h
* 文件描述: 模板双向链表头文件
* 创 建 人: Toony, 2010-05-26
* 版 本 号: V1.0.0
* 修改记录: 无
************************************************************************/
#ifndef NULL
#define NULL 0
#endif
typedef unsigned int UNINT;
/************************************************************************
* 类 名: CNode
* 类 描 述: CDoubleList用节点类
* 创 建 人: Toony, 2010-05-26
************************************************************************/
template <typename DataType>
class CNode
{
public:
CNode();
~CNode();
DataType data;
CNode *lpNext;
CNode *lpPre;
};
//*=======================================================================
//* 函 数 名: CNode<DataType>::CNode()
//* 功能描述: 构造函数
//* 参 数: 无
//*
//* 抛出异常: 无
//*
//* 返 回 值: 无
//* 作 者: Toony, 2010-05-26
//=======================================================================*/
template <typename DataType>
CNode<DataType>::CNode()
{
lpNext = lpPre = NULL;
}
//*=======================================================================
//* 函 数 名: CNode<DataType>::~CNode()
//* 功能描述: 析构函数
//* 参 数: 无
//*
//* 抛出异常: 无
//*
//* 返 回 值: 无
//* 作 者: Toony, 2010-05-26
//=======================================================================*/
template <typename DataType>
CNode<DataType>::~CNode()
{
}
/************************************************************************
* 类 名: CDoubleList
* 类 描 述: 模板双向链表类
* 创 建 人: Toony, 2010-05-26
************************************************************************/
template <typename DataType>
class CDoubleList
{
public:
CDoubleList();
~CDoubleList();
int Insert(DataType m_newNode);
int Insert(UNINT nwIndex, DataType newNode);
void Delete(UNINT nwIndex);
void DeleteAll();
void DeleteLast();
DataType &GetAt(UNINT nwIndex);
void SetAt(UNINT nwIndex, DataType newNode);
size_t GetLength();
private:
size_t nwLength;
CNode<DataType> *lpHead;
CNode<DataType> *lpTail;
};
//*=======================================================================
//* 函 数 名: CDoubleList<DataType>::CDoubleList()
//* 功能描述: 构造函数
//* 参 数: 无
//*
//* 抛出异常: 无
//*
//* 返 回 值: 无
//* 作 者: Toony, 2010-05-26
//=======================================================================*/
template <typename DataType>
CDoubleList<DataType>::CDoubleList()
{
lpHead = lpTail = NULL;
nwLength = 0;
}
//*=======================================================================
//* 函 数 名: CDoubleList<DataType>::~CDoubleList()
//* 功能描述: 析构函数
//* 参 数: 无
//*
//* 抛出异常: 无
//*
//* 返 回 值: 无
//* 作 者: Toony, 2010-05-26
//=======================================================================*/
template <typename DataType>
CDoubleList<DataType>::~CDoubleList()
{
DeleteAll();
}
//*=======================================================================
//* 函 数 名: int CDoubleList<DataType>::Insert(DataType newNode)
//* 功能描述: 向链表追加节点
//* 参 数: <DataType> newNode - 插入节点的数据
//*
//* 抛出异常: 无
//*
//* 返 回 值: 0 - 失败
//* 1 - 成功
//* 作 者: Toony, 2010-05-26
//=======================================================================*/
template <typename DataType>
int CDoubleList<DataType>::Insert(DataType newNode)
{
CNode<DataType> *lpNewNode = new CNode<DataType>;
if (lpNewNode == NULL)
return 0;
lpNewNode->data = newNode;
if (lpHead == NULL)
lpHead = lpNewNode;
else if (lpTail != NULL)
lpTail->lpNext = lpNewNode;
lpNewNode->lpPre = lpTail;
lpTail = lpNewNode;
++ nwLength;
return 1;
}
//*=======================================================================
//* 函 数 名: int CDoubleList<DataType>::Insert(UNINT nwIndex, DataType newNode)
//* 功能描述: 向指定位置插入节点,若nwIndex不存在,则向链表追加节点
//* 参 数: UNINT nwIndex - 插入节点位置,从0开始.
//* <DataType> newNode - 插入节点的数据
//*
//* 抛出异常: 无
//*
//* 返 回 值: 0 - 失败
//* 1 - 成功
//* 作 者: Toony, 2010-05-26
//=======================================================================*/
template <typename DataType>
int CDoubleList<DataType>::Insert(UNINT nwIndex, DataType newNode)
{
if (nwIndex >= nwLength)
return Insert(newNode);
CNode<DataType> *lpTemp, *lpNewNode;
lpTemp = lpHead;
lpNewNode = new CNode<DataType>;
if (lpNewNode == NULL)
return 0;
lpNewNode->data = newNode;
for (UNINT nI = 0; nI < nwIndex && lpTemp->lpNext; nI ++)
lpTemp = lpTemp->lpNext;
if (lpTemp->lpPre == NULL) /*在头部插入节点*/
{
lpNewNode->lpNext = lpHead;
lpHead = lpNewNode;
}
else /*在中间插入节点*/
{
lpTemp->lpPre->lpNext = lpNewNode;
lpNewNode->lpPre = lpTemp->lpPre;
lpNewNode->lpNext = lpTemp;
lpTemp->lpPre = lpNewNode;
}
++ nwLength;
return 1;
}
//*=======================================================================
//* 函 数 名: void CDoubleList<DataType>::DeleteAll()
//* 功能描述: 删除所有节点
//* 参 数: 无
//*
//* 抛出异常: 无
//*
//* 返 回 值: 无
//* 作 者: Toony, 2010-05-26
//=======================================================================*/
template <typename DataType>
void CDoubleList<DataType>::DeleteAll()
{
if (lpHead == NULL)
return;
CNode<DataType> *lpTemp;
while (lpHead)
{
lpTemp = lpHead->lpNext;
delete lpHead;
lpHead = lpTemp;
}
lpHead = lpTail = NULL;
nwLength = 0;
}
//*=======================================================================
//* 函 数 名: size_t CDoubleList<DataType>::GetLength()
//* 功能描述: 返回当前链表长度
//* 参 数: 无
//*
//* 抛出异常: 无
//*
//* 返 回 值: size_t - 链表长度
//* 作 者: Toony, 2010-05-26
//=======================================================================*/
template <typename DataType>
size_t CDoubleList<DataType>::GetLength()
{
return nwLength;
}
//*=======================================================================
//* 函 数 名: size_t CDoubleList<DataType>::Delete(UNINT nwIndex)
//* 功能描述: 删除链表中的指定节点,若nwIndex不存在,则删除尾节点
//* 参 数: UNINT nwIndex - 即将删除的节点下标,从0开始.
//*
//* 抛出异常: 无
//*
//* 返 回 值: 无
//* 作 者: Toony, 2010-05-26
//=======================================================================*/
template <typename DataType>
void CDoubleList<DataType>::Delete(UNINT nwIndex)
{
if (lpHead == NULL)
return;
if (nwIndex >= nwLength - 1)
return DeleteLast();
CNode<DataType> *lpTemp;
lpTemp = lpHead;
for (UNINT nI = 0; nI < nwIndex && lpTemp->lpNext; nI ++)
lpTemp = lpTemp->lpNext;
if (lpTemp->lpPre == NULL) /*删除头结点 (已保证该结点不是尾节点)*/
{
lpHead = lpHead->lpNext;
lpHead->lpPre = NULL;
}
else /*删除中间节点 (已保证该结点不是尾节点) */
{
lpTemp->lpPre->lpNext = lpTemp->lpNext;
lpTemp->lpNext->lpPre = lpTemp->lpPre;
}
delete lpTemp;
-- nwLength;
}
//*=======================================================================
//* 函 数 名: void CDoubleList<DataType>::DeleteLast()
//* 功能描述: 删除链表中最后一个节点
//* 参 数: 无
//*
//* 抛出异常: 无
//*
//* 返 回 值: 无
//* 作 者: Toony, 2010-05-26
//=======================================================================*/
template <typename DataType>
void CDoubleList<DataType>::DeleteLast()
{
if (lpTail == NULL)
return;
if (lpTail == lpHead /*<=> lpTail->lpPre == NULL <=> nwLength == 1 */)
{
delete lpHead; /*删除唯一节点 (该节点既是头结点又是尾节点)*/
lpHead = lpTail = NULL;
}
else
{
lpTail = lpTail->lpPre;
delete lpTail->lpNext;
lpTail->lpNext = NULL;
}
-- nwLength;
}
//*=======================================================================
//* 函 数 名: DataType &CDoubleList<DataType>::GetAt(UNINT nwIndex)
//* 功能描述: 返回链表中指定节点的数据,若nwIndex不存在,则返回尾节点的数据
//* 参 数: UNINT nwIndex - 要返回的节点下标,从0开始
//*
//* 抛出异常: 无
//*
//* 返 回 值: <DataType> - 节点数据
//* 作 者: Toony, 2010-05-26
//=======================================================================*/
template <typename DataType>
DataType &CDoubleList<DataType>::GetAt(UNINT nwIndex)
{
if (nwIndex == 0)
return lpHead->data;
if (nwIndex == nwLength - 1)
return lpTail->data;
CNode<DataType> *lpTemp;
lpTemp = lpHead;
for (UNINT nI = 0; nI < nwIndex && lpTemp->lpNext; nI ++)
lpTemp = lpTemp->lpNext;
return lpTemp->data;
}
//*=======================================================================
//* 函 数 名: void CDoubleList<DataType>::SetAt(UNINT nwIndex, DataType newNode)
//* 功能描述: 修改链表中指定下标的数据,若nwIndex不存在,则修改尾节点的数据
//* 参 数: UNINT nwIndex - 要修改的节点的下标,从0开始
//* <DataType> newNode - 要修改的节点的数据
//*
//* 抛出异常: 无
//*
//* 返 回 值: 无
//* 作 者: Toony, 2010-05-26
//=======================================================================*/
template <typename DataType>
void CDoubleList<DataType>::SetAt(UNINT nwIndex, DataType newNode)
{
if (lpHead == NULL)
return;
CNode<DataType> *lpTemp;
lpTemp = lpHead;
if (nwIndex == nwLength - 1)
lpTemp = lpTail;
else
for (UNINT nI = 0; nI < nwIndex && lpTemp->lpNext; nI ++)
lpTemp = lpTemp->lpNext;
lpTemp->data = newNode;
}
相关文章推荐
- C++类模板 实现双向循环链表的基本算法 《数据结构》(C++版 北京科海)中摘抄
- C++模板实现双向链表
- C++模板实现双向循环链表(有带头结点)
- C++ 双向链表 使用模板 增删操作
- c++模板实现双向链表
- C++模板及用模板实现双向循环链表,顺序表
- C++模板--------双向链表
- C++ 模板双向不循环链表!!
- 【C++】模板实现带头节点的双向循环链表
- C++ 学习练手 - 双向链表的模板实现
- c++模板实现双向链表
- c++实现单链表,双向链表,顺序表的接口(非模板)
- 使用C++实现的双向链表
- C++ 实现双向链表的实例
- C++模板链表简单demo
- C++ List 双向链表 实现 会用也要会写
- 原创:C++实现的可排序的双向链表
- 数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现
- 【代码】模板实现双向链表的去重、拼接、合并、排序
- c++实现双向链表的常用功能