双向链表要求建立当前节点和他前驱和后继的关系,切必须保证有序。包含插入、删除、排序、遍历输出等函数。
详见代码:
#include <iostream>
using namespace std;
template<class T>
struct Node
{
T data;
Node<T> *rlink,*llink;
};
template<class T>
class Dlinklist
{
Node<T> *head;
public:
Dlinklist();///无参的构造函数
Dlinklist(T a[],int n);///头插法构造双向链表
Dlinklist(T a[],int n,int k);///尾插法构造双向链表
void add(T a);///添加节点
int delet(T a);///删除节点
int len();///返回链表长度
int sear(T a);///查找值为a的节点
void print();///遍历输出所有节点
void sortn(int n);///排序
};
template<class T>
Dlinklist<T>::Dlinklist()///无参的构造函数
{
head = new Node<T>;
head->rlink=0;
head->llink=0;
}
template<class T>
Dlinklist<T>::Dlinklist(T a[],int n)///头插法构造双向链表
{
Node<T> *s;
head=new Node<T>;
head->rlink=0;
head->llink=0;
for(int i=0; i<n; i++)
{
s=new Node<T>;
s->data=a[i];
s->rlink=head->rlink;
head->rlink=s;
s->llink=head;
if(s->rlink!=0)
s->rlink->llink=s;
}
}
template<class T>
Dlinklist<T>::Dlinklist(T a[],int n,int k)///尾插法构造双向链表
{
Node<T> *s,*r;
head=new Node<T>;
r=head;
head->llink=0;
head->rlink=0;
for(int i=0; i<n; i++)
{
s=new Node<T>;
s->data=a[i];
r->rlink=s;
s->llink=r;
r=s;
}
r->rlink=0;
}
template<class T>
void Dlinklist<T>::add(T a)///添加节点
{
Node<T> *s;
s=new Node<T>;
s->data=a;
s->rlink=head->rlink;
head->rlink=s;
s->llink=head;
if(s->rlink)
s->rlink->llink=s;
}
template<class T>
int Dlinklist<T>::delet(T a)///删除节点
{
Node<T> *s;
s=head->rlink;
while(s)
{
if(s->data==a)
{
if(s->rlink==0)
s->llink->rlink=0;
else
{
s->llink->rlink=s->rlink;
s->rlink->llink=s->llink;
}
delete s;
return 1;
}
s=s->rlink;
}
return 0;
}
template<class T>
int Dlinklist<T>::sear(T a)///查找值为a的节点
{
int n = 0;
Node<T>*s;
s = head->rlink;
while(s!=0)
{
n++;
if(s->data==a)
return n;
s = s->rlink;
}
return 0;
}
template<class T>
int Dlinklist<T>::len()///返回链表长度
{
int n = 0;
Node<T> *s;
s = head->rlink;
while(s!=0)
{
n++;
s = s->rlink;
}
return n;
}
template<class T>
void Dlinklist<T>::print()///遍历输出所有节点
{
Node<T> *s;
s = head->rlink;
while(s)
{
cout<<s->data<<" ";
s = s->rlink;
}
cout<<endl;
}
template<class T>
void Dlinklist<T>::sortn(int n)///排序
{
int t;
Node<T> *s;
for(int i=0; i<n-1; i++)
{
s=head->rlink;
for(int j=0; j<n-i-1; j++)
{
if(s->data>s->rlink->data)
{
t=s->data;
s->data=s->rlink->data;
s->rlink->data=t;
}
s=s->rlink;
}
}
}
int main()
{
int t,i;
int a[200000];
for(i=0; cin>>t;)
{
if(t==0)
break;
else
a[i++]=t;
}
Dlinklist<int> l1(a,i);
l1.sortn(l1.len());
l1.print();
while(cin>>t)
{
if(t==0)
break;
else
l1.add(t);
}
l1.sortn(l1.len());
l1.print();
while(cin>>t)
{
if(t==0)
break;
else
while(l1.delet(t)==1);
}
l1.sortn(l1.len());
l1.print();
return 0;
}