C++实现双循环链表(类模板,详细注释)

C++实现双循环链表

本人就读于辽宁科技大学计算机科学技术专业,现在大一,C++小白,欢迎斧正!

单链表与双循环链表的区别
与单链表相比,双循环链表的每一个结点都有一个前驱指针域,用于储存前驱结点的地址,并且终端结点的后驱指针域不再为空,而是指向头结点。
(以下图片均来自《数据结构第二版》)
主要区别体现在结点插入和删除时

  • 插入对比:
    在这里插入图片描述双循环链表的插入操作
    双循环链表插入实现代码:
    ①s->prior=p;
    ②s->next=p->next;
    ③p->next->prior=s;
    ④p->next=s;
    注意:④不可出现在②③之前,②③p充当桥梁。

  • 删除对比:
    在这里插入图片描述
    在这里插入图片描述
    双循环链表删除实现代码:
    ①p->prior->next=p->next;
    ②p->next->prior=p->prior;

  • 运行结果:
    在这里插入图片描述

  • 代码实现

#include<iostream>
using namespace std;
template<class T>//结点(类模板)
class Node
{
public:
    T data;//该结点数据域
    Node<T> *next;//后继结点指针域
    Node<T> *prior;//前驱结点指针域
};
template<class T>
class Double_LoopLinkList
{
private:
    Node<T> *head;//头结点
public:
    Double_LoopLinkList();//构造函数
    void CreateList();//创建双循环链表
    ~Double_LoopLinkList();//析构函数
    int Length();//求双循环链表的长度
    bool Get(int index);//得到序号为index的结点元素值
    bool Locate(T data);//得到第一个元素值为data的结点的序号
    bool Insert(int index,T data);//在序号index位置插入元素值为data的结点
    bool Delete(int index);//删除序号为index的结点
    bool PrintList();//输出双循环链表所有结点的元素值
    void Exchangedata(int index1,int index2);//进行两结点元素值的交换
    void ReverseDouble_LoopList(Double_LoopLinkList<T> &L);//实现双循环链表的翻转
};
template<class T>
Double_LoopLinkList<T>::Double_LoopLinkList()//初始化为空双循环链表
{
    head=new Node<T>;
    head->data=0;
    head->prior=NULL;
    head->next=head;
}
template<class T>
void Double_LoopLinkList<T>::CreateList()
{
    int length;
    T data;
    cout<<"正在创建双循环链表(尾插),请输入你要创建的双循环链表的长度"<<endl;
    cin>>length;
    for(int i=0;i<length;i++)
    {
        cout<<"请输入第"<<i+1<<"个结点的元素值:";
        cin>>data;
        Insert(Length()+1,data);//采用尾插方式进行创建单链表
    }
}
template<class T>
bool Double_LoopLinkList<T>::Insert(int index,T data)
{
    Node<T> *p=head,*s;
    if(index<=0)
    {
        cout<<"插入位置不合法,请输入为正数的插入位置"<<endl;
        return false;
    }
        if(index>Length())//所插位置超出单链表长度时
        {
            while(p->next!=head)
            {
                p=p->next;
            }
            //此时指针p指向终端结点
            s=new Node<T>;
            s->data=data;//给予数据
            p->next=s;//s成为p的后继结点
            s->prior=p;//p成为s的前驱结点
            s->next=head;//s成为终端结点,并指向头结点
            head->prior=s;//s成为头结点的前驱结点
            //进行双循环链表的插入;
        }
            else//所插位置位于链表长度内时
            {

                for(int i=0;i<index-1;i++)
            {
                p=p->next;
            }
            //此时指针p指向第index-1个结点
            s=new Node<T>;
            s->data=data;
            s->prior=p;
            s->next=p->next;
            p->next->prior=s;
            p->next=s;
            //进行双循环链表的插入
            cout<<"已成功插入结点n(*≧▽≦*)n"<<endl;
            return true;
            }
}
template<class T>
int Double_LoopLinkList<T>::Length()
{
    Node<T> *p=head;
    int num=0;//累加器
    while(p->next!=head)
    {
        num++;
        p=p->next;
    }
    return num;
}
template<class T>
Double_LoopLinkList<T>::~Double_LoopLinkList()//销毁双循环链表
{
    Node<T> *p=head->next;
    Node<T> *s=NULL;
    while(p!=head)
    {
        s=p;
        p=p->next;
        delete s;
    }
    delete p;
    delete head;
    cout<<"单链表销毁成功╭(╯^╰)╮"<<endl;
}
template<class T>
bool Double_LoopLinkList<T>::Get(int index)
{
    Node<T> *p=head;
    if(index<=0||index>Length())//超出查找范围
    {
        cout<<"结点元素查找不合法"<<endl;
        return false;
    }
    else
    {
        for(int i=0;i<index;i++)
    {
        p=p->next;
    }
    cout<<"查找成功,该结点的元素值为:"<<p->data<<endl;
    return true;
    }
}
template<class T>
bool Double_LoopLinkList<T>::Locate(T data)
{
    Node<T> *p=head;
    int num=0;
    while(p->next!=head)
    {
        num++;
        p=p->next;
        if(p->data==data)
        {
            cout<<"成功找到该结点,该结点点到的位置为:"<<num<<endl;
            return true;
        }
    }
    cout<<"该双循环链表中没有该结点"<<endl;
    return false;
}
template<class T>
bool Double_LoopLinkList<T>::Delete(int index)
{
    Node<T> *p=head;
    if(index<=0||index>Length())
    {
        cout<<"删除位置不合法"<<endl;
    return false;
    }
    else if(index==Length())
    {
        for(int i=0;i<Length()-1;i++)
    {
        p=p->next;
    }
    p->next=head;
    }
    else
    {
        for(int i=0;i<index;i++)
    {
        p=p->next;
    }
    p->next->prior=p->prior;
    p->prior->next=p->next;
    cout<<"成功删除结点"<<index<<endl;
    return true;
    }
}
template<class T>
bool Double_LoopLinkList<T>::PrintList()
{
    int i=1;
    Node<T> *p=head;
    if(p->next==head)
    {
        cout<<"该双循环链表为空链表!"<<endl;
        return false;
    }
    else
    {
    while(p->next!=head)
    {
        p=p->next;
        cout<<"第"<<i<<"个结点的元素值为:"<<p->data<<endl;
        i++;
    }
    cout<<"成功输出结点元素值!"<<endl;
    return true;
    }
}
template<class T>
void Double_LoopLinkList<T>::Exchangedata(int index1,int index2)
{
    Node<T> *p=head,*s1,*s2;
    int Min,Max,data;
    //定位结点的前后
    Min=(index1>index2)?index2:index1;
    Max=(index1>index2)?index1:index2;
    if(Min>0&&Max<=Length())
    {
        for(int i=0;i<Min-1;i++)
    {
        p=p->next;
    }
    s1=p->next;//此时s1指向index1结点
    p=head;
    for(int i=0;i<Max-1;i++)
    {
        p=p->next;
    }
    s2=p->next;//此时s2指向index2结点
    //实现数据的交换
    data=s1->data;
    s1->data=s2->data;
    s2->data=data;
    cout<<"结点元素值交换成功"<<endl;
    }
    else
        cout<<"结点元素值交换失败"<<endl;
}
template<class T>
void Double_LoopLinkList<T>::ReverseDouble_LoopList(Double_LoopLinkList<T> &L)
{
    Node<T> *p=head;
    while(p->next!=head)
    {
        p=p->next;
    }
    cout<<"翻转后的结点元素值分别为:";
    for(int i=0;i<Length();i++)
    {
        cout<<p->data<<" ";
        p=p->prior;
    }
    cout<<endl;
}
int main()
{
    cout<<"-------------------------------------------------双循环链表操作系统---------------------------------------------------"<<endl;
    Double_LoopLinkList<int> list;
    list.CreateList();
    cout<<"------------------双循环链表已创建成功------------------"<<endl;
    list.PrintList();
    cout<<"------------------Insert--------------------"<<endl;
    list.Insert(3,2);
    list.PrintList();
    cout<<"------------------Delete--------------------"<<endl;
    list.Delete(2);
    list.PrintList();
    cout<<"--------------------Get---------------------"<<endl;
    list.Get(1);
    cout<<"--------------------Exchange----------------"<<endl;
    list.Exchangedata(1,2);
    list.PrintList();
    cout<<"--------------------Reverse-----------------"<<endl;
    list.ReverseDouble_LoopList(list);
    cout<<"-------------------------------------------------已退出双循环链表操作系统-----------------------------------------------"<<endl;
    return 0;
}
发布了11 篇原创文章 · 获赞 3 · 访问量 1296

猜你喜欢

转载自blog.csdn.net/pipihan21/article/details/104430721
今日推荐