直接挂代码了,写双向链表没出啥问题
/************************************************************************
* 文 件 名: 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;
}