3、循环双向链表
实验目的
巩固线性表的数据结构的存储方法和相关操作,学会针对具体应用,使用线性表的相关知识来解决具体问题。
#include<iostream>
using namespace std;
template <class Datatype>
struct dcirNode {
public:
Datatype data;
dcirNode<Datatype> *prior, *next;
};
template<class Datatype>
class DoubleCircularLinkList{
public:
DoubleCircularLinkList();
~DoubleCircularLinkList() {delete first;}
void CreateLinkList(int n);
void InsertNode(int i, int n);
void printLinkList();
bool IsEmpty();
int GetLength();
void DeleteNode(int i);
void DeleteLinkList();
private:
dcirNode<Datatype> *first;
};
template<class Datatype>
DoubleCircularLinkList<Datatype>::DoubleCircularLinkList() {
first=new dcirNode<Datatype>;
first->data=0;
first->next=first;
first->prior=first;
}
template<class Datatype>
void DoubleCircularLinkList<Datatype>::CreateLinkList(int n) {
if (n<0) {
cout<<"输入结点个数错误!"<<endl;
exit(0);
}
else {
int i=0;
dcirNode<Datatype> *q, *p;
p=first;
i=n;
while (n--> 0) {
q=new dcirNode<Datatype>;
cout<<"输入第"<<i-n<<"个结点:";
cin>>q->data;
q->next=first;
q->prior=p;
p->next=q;
p=q;
}
}
}
template<class Datatype>
void DoubleCircularLinkList<Datatype>::InsertNode(int i, int n) {
if (i<0||i>GetLength()+1) {
cout<<"输入位置错误!"<< endl;
exit(EXIT_FAILURE);
}
else {
dcirNode<Datatype> *q, *p;
q=new dcirNode<Datatype>;
q->data=n;
p=first;
while (i-->1)
p=p->next;
q->next=p->next;
q->prior=p;
p->next=q;
p=q;
}
}
template<class Datatype>
void DoubleCircularLinkList<Datatype>::printLinkList() {
dcirNode<Datatype> *p=first->next;
while(p!=first) {
cout<<p->data<<" ";
p=p->next;
}
cout << endl;
}
template<class Datatype>
bool DoubleCircularLinkList<Datatype>::IsEmpty() {
if (first==first->next)
return true;
else
return false;
}
template<class Datatype>
int DoubleCircularLinkList<Datatype>::GetLength() {
int n=0;
dcirNode<Datatype> *p=first->next;
while(p!=first) {
n++;
p=p->next;
}
return n;
}
template<class Datatype>
void DoubleCircularLinkList<Datatype>::DeleteNode(int i) {
if (i< 0||i>GetLength()) {
cout<<"输入位置错误!"<<endl;
exit(1);
}
else {
dcirNode<Datatype> *pdel, *p;
p=first;
while (i-- >1)
p=p->next;
pdel=p->next;
p->next=pdel->next;
pdel->next->prior=p;
delete pdel;
pdel=NULL;
}
}
template<class Datatype>
void DoubleCircularLinkList<Datatype>::DeleteLinkList() {
dcirNode<Datatype> *pdel, *p;
pdel=first->next;
while (pdel!=first) {
p=pdel->next;
first->next=p;
p->prior=first;
delete pdel;
pdel=p;
}
}
int main() {
DoubleCircularLinkList<int> dcl;
int i=0,value=0,n=0;
bool flag = false;
cout<<"请输入需要创建双向循环链表的结点个数:";
cin>>n;
dcl.CreateLinkList(n);
cout<<"链表值如下:";
dcl.printLinkList();
cout<<"请输入要插入结点的位置和值:";
cin>>i>>value;
dcl.InsertNode(i,value);
cout<<"遍历链表值如下:";
cout<<"现链表长度为:"<<dcl.GetLength()<<endl;
cout<<"请输入要删除结点的位置:";
cin>>i;
dcl.DeleteNode(i);
cout<<"遍历链表值如下:";
dcl.printLinkList();
cout<<"现链表长度为:"<<dcl.GetLength()<<endl;
dcl.DeleteLinkList();
flag=dcl.IsEmpty();
if (flag)
cout<<"删除链表成功!"<<endl;
else
cout<<"删除链表失败!"<<endl;
return 0;
}