您的位置:首页 > 编程语言 > C语言/C++

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;

}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ null insert delete 2010