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;
    }
};

源码,经典。 CARD *myinsert(LCARD *head, LCARD *insert) { LCARD *temp = NULL; if (head==NULL)//链表为空 { head = insert; insert->next = insert; insert->prior = insert; } else//链表非空 { temp = head; if (head->cardnum>insert->cardnum)//插入到头前边,并且把自己当作头 { head->prior->next = insert; insert->prior = head->prior; insert->next = head; head->prior = insert; head = insert; } if (insert->cardnum0<50)//小于50正向插入 { while ((temp->cardnum<insert->cardnum)&&(temp->next!=head))//循环 { temp = temp->next; } if (temp->cardnum>insert->cardnum)//第一个条件终止的 { temp->prior->next = insert; insert->prior = temp->prior; insert->next = temp; temp->prior = insert; } else//第二个条件终止的 { head->prior->next = insert; insert->prior = head->prior; insert->next = head; head->prior = insert; } } else//大于50反向插入 { while ((temp->cardnum>insert->cardnum)&&(temp->prior!=head))//循环,第二个条件禁止跑飞 { temp = temp->prior; } if (temp->cardnum<insert->cardnum)//只有第一个条件可以终止的 { temp->next->prior = insert; insert->next = temp->next; insert->prior = temp; temp->next = insert; } } } //printf("%d\t%d\n", insert->id, insert->cardnum); return head; } void swap_id(SWID *sw) { LCARD *temp = sw->head; if (sw->head->cardnum==sw->swapcardnum) { printf("out person cardnum=%d\n", sw->head->id); sw->head->id = sw->inID; return ; } if ((sw->swapcardnum0)<50) { while ((temp->cardnum!=sw->swapcardnum)&&(temp->next!=sw->head)) { temp = temp->next; } if (temp->cardnum==sw->swapcardnum) { printf("out person cardnum=%d\n", sw->head->id); temp->id = sw->inID; } } else { while ((temp->cardnum!=sw->swapcardnum)&&(temp->prior!=sw->head)) { temp = temp->prior; } if (temp->cardnum==sw->swapcardnum) { printf("out person cardnum=%d\n", sw->head->id); temp->id = sw->inID; } } } LCARD *mydel(LCARD *head, LCARD *del) { LCARD *temp = NULL; if (head==NULL)//没有链表 { printf("there is no card\n"); } else//有链表 { if(head->next==head)//链表里就有一个节点并且为头结点 { if (head->cardnum==del->cardnum) { free(head); head = NULL; } else { printf("in mydel error\n"); } } else//链表里有超过一个的节点 { temp = head; if (del->cardnum0<50)//成立则正向删除 { while ((temp->cardnum!=del->cardnum)&&(temp->next!=head)) { temp = temp->next; } if (temp->cardnum==del->cardnum) { temp->prior->next = temp->next; temp->next->prior = temp->prior; free(temp); } } else//反向删除 { while ((temp->cardnum!=del->cardnum)&&(temp->prior!=head)) { temp = temp->prior; } if (temp->cardnum==del->cardnum) { temp->prior->next = temp->next; temp->next->prior = temp->prior; free(temp); } } } } return head; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值