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