C++模板-双向链表

直接挂代码了,写双向链表没出啥问题

/************************************************************************
*   文 件 名:   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;
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值