c++双向链表源代码

c++双向链表源代码


#pragma          //保证该头文件只被添加一次

/******************************************************************************************
*  日期:2016-08-07
*  作者:忠义乾坤
*  描述:
*      1. 双向链表
*      2. 可在链表【头】和【尾】删除结点
*      3. 可在链表【头】和【尾】添加新结点
*      4. 采用类模板,可自定义数据类型
*  说明:将该文件放在DLinkList.h文件中,在源文件中包含#include"dlinklist.h"即可
********************************************************************************************/



//********************************************************************
//  类名:DListNode
//  描述:创建一个双向链表结点类
//********************************************************************
template<typename DataType>
class DListNode
{

public:
    DataType m_data;    //结点数据
    DListNode<DataType> *m_nextPtr;//结点后继指针
    DListNode<DataType> *m_priorPtr;//结点前驱指针

    //************************【使结点的前驱与后继清零,并赋予结点数据】*************
    DListNode(const DataType &newData)
    {
        m_data = newData;
        m_nextPtr = NULL;
        m_priorPtr = NULL;
    }

    //************************【使结点的前驱与后继清零】***************************
    ~DListNode()
    {
        m_nextPtr = NULL;
        m_priorPtr = NULL;
    }

    //************************【获取结点数据】***********************************
    DataType getData() const
    {
        return m_data;
    }
};


//********************************************************************
//  类名:DLinkList
//  描述:创建一个双向链表类
//********************************************************************
template<typename DataType> 
class DLinkList
{
private:
    int length;                   //链表的长度
    DListNode<DataType> *m_head;  //头结点
    DListNode<DataType> *m_tail;  //尾结点
public:
    //************************【初始化头尾结点】********************************
    DLinkList()
    {
        length = 0;       //起始链表为空,长度为0
        m_head = NULL;
        m_tail = NULL;
    }

    //*************************【清空数据,释放内存】***************************
    ~DLinkList()
    {
        cleanAll();
    }

    //*************************【在链表尾插入结点】*****************************
    void insertFromBack(const DataType &newData)
    {
        DListNode<DataType> *newPtr = new DListNode<DataType>(newData);

        if (isEmpty() == true)
        {
            m_head = newPtr;
            m_tail = newPtr;
        }
        else 
        {
            m_tail->m_nextPtr =newPtr;
            newPtr->m_priorPtr = m_tail;
            m_tail = newPtr;
        }
        length ++;  ///链表长度增加1

    }

    //***************************【在链表头插入结点】***************************
    void insertFromFront(const DataType &newData)
    {
        DListNode<DataType> *newPtr = new DListNode<DataType> (newData);

        if(isEmpty() == true)
        {
            m_tail = newPtr;
            m_head = newPtr;
        }
        else 
        {
            m_head->m_priorPtr = newPtr;
            newPtr->m_nextPtr = m_head;
            m_head = newPtr;
        }
        length ++; //链表长度增加1

    }

    //***************************【从头打印链表数据,仅支持内置数据类型】*************
    void printFromFront (void)
    {

        DListNode <DataType> *tempPtr;
        tempPtr = m_head;
        while(tempPtr !=NULL)
        {
            cout<<tempPtr->getData()<<"\t"<< tempPtr<<endl;   //输出结点数据与地址方便调试
            tempPtr = tempPtr->m_nextPtr;
        }
    }

    //***************************【从尾打印链表数据,仅支持内置数据类型】*************
    void printFromBack(void)
    {
        DListNode<DataType> *tempPtr;
        tempPtr = m_tail;
        while(tempPtr !=NULL)
        {
            cout<<tempPtr->getData()<<"\t"<< tempPtr<<endl;   //输出结点数据与地址方便调试
            tempPtr = tempPtr->m_priorPtr;

        }

    }

    //****************************【从头移除链表数据】*******************************
    bool removeFromFront(void)
    {
        if(isEmpty() == true)
            return false;
        else
        {
            if(m_head == m_tail)            //头结点和尾结点为同一结点的情况
            {
                delete m_head;
                m_head = NULL;
                m_tail =NULL;
                length -- ;                //链表长度减1
                return true;
            }                            
            else                   //头结点和尾结点为不同结点的情况
            {
                m_head = m_head->m_nextPtr;
                delete m_head->m_priorPtr;
                m_head->m_priorPtr = NULL;
                length --;         //链表长度减1
                return true;
            }

        }
    }

    //************************【从尾移除链表数据】***********************************
    bool removeFromBack(void)
    {
        if(isEmpty() == true)
        {
            return false;
        }
        else
        {
            if(m_head == m_tail)
            {
                delete m_head;
                m_head = NULL;
                m_tail = NULL;
                length --;           //链表长度减1
                return true;
            }
            else
            {
                m_tail = m_tail->m_priorPtr;
                delete m_tail->m_nextPtr;
                m_tail->m_nextPtr = NULL;
                length --;         //链表长度减1
                return true;
            }
        }
    }

    //*****************************【判断链表是否为空】***********************************
    bool isEmpty(void)
    {
        if(m_head == NULL && m_tail ==NULL)
            return true;
        else 
            return false;
    }

    //*****************************【清空链表,释放内存】*********************************
    void cleanAll(void)
    {
        if(isEmpty() == true)
            return ;
        else
        {
            while(m_head !=m_tail)
            {
                m_head = m_head->m_nextPtr;
                delete m_head->m_priorPtr;
                m_head->m_priorPtr = NULL;
            }
            delete m_head;
            length = 0;     //清空链表长度
            m_head = NULL;
            m_tail = NULL;
        }
    }

    //***************************【获取链表头结点】**********************************
    DListNode<DataType> *getHeadPoint()
    {
        if(isEmpty() == true)
            return NULL;
        else 
            return m_head;
    }

    //****************************【获取链表长度】***********************************
    int getLength(void)
    {
        return length;;
    }

    //***************************【获取链表的尾结点指针】*****************************
    DListNode<DataType>* getTailPoint(void)
    {
        return m_tail;
    }
};

已标记关键词 清除标记
相关推荐
<p> <b><span style="background-color:#FFE500;">【超实用课程内容】</span></b> </p> <p> <br /> </p> <p> <br /> </p> <p> 本课程内容包含讲解<span>解读Nginx的基础知识,</span><span>解读Nginx的核心知识、带领学员进行</span>高并发环境下的Nginx性能优化实战,让学生能够快速将所学融合到企业应用中。 </p> <p> <br /> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <b><br /> </b> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <b><span style="background-color:#FFE500;">【课程如何观看?】</span></b> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> PC端:<a href="https://edu.csdn.net/course/detail/26277"><span id="__kindeditor_bookmark_start_21__"></span></a><a href="https://edu.csdn.net/course/detail/27216">https://edu.csdn.net/course/detail/27216</a> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 移动端:CSDN 学院APP(注意不是CSDN APP哦) </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 本课程为录播课,课程永久有效观看时长,大家可以抓紧时间学习后一起讨论哦~ </p> <p style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <br /> </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <strong><span style="background-color:#FFE500;">【学员专享增值服务】</span></strong> </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <b>源码开放</b> </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 课件、课程案例代码完全开放给你,你可以根据所学知识,自行修改、优化 </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 下载方式:电脑登录<a href="https://edu.csdn.net/course/detail/26277"></a><a href="https://edu.csdn.net/course/detail/27216">https://edu.csdn.net/course/detail/27216</a>,播放页面右侧点击课件进行资料打包下载 </p> <p> <br /> </p> <p> <br /> </p> <p> <br /> </p>
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页