在双向链表中既有前向链又有后向链,寻找任一个结点的直接前驱结点与直接后继结点变得非常方便。
#include<iostream>
#include<algorithm>
using namespace std;
template<typename T>
struct DNode//链表节点
{
T data;
DNode<T> *llink;//前驱指针域
DNode<T> *rlink;//后继指针域
};
template<class T>
class DoubleLink
{
private:
DNode<T> *head;//头指针
public:
DoubleLink();//构造函数
~DoubleLink();//析构函数
DoubleLink(T a[],int n);//有参构造韩束
void add(T a[],int m);//插入函数(可插入多个数据以数组的的形式)
void del(T a[],int n);//删除函数(可以数组的形式删除多个数据)
void print();//遍历函数
};
template<class T>
DoubleLink<T>::DoubleLink()//无参构造函数
{
head=new DNode<T>;
head->rlink=NULL;
head->llink=NULL;
}
template<class T>
DoubleLink<T>::DoubleLink(T a[],int n)//有参构造函数
{
head=new DNode<T>;
head->rlink=NULL;
head->llink=NULL;
DNode<T> *r,*s;
r=head;
for(int i=0; i<n; i++)
{
s=new DNode<T>;
s->data=a[i];
s->llink=r;
r->rlink=s;
r=s;
}
r->rlink=NULL;
}
template<class T>
DoubleLink<T>::~DoubleLink()//析构函数
{
DNode<T> *q;
while(head)
{
q=head->rlink;
delete head;
head=q;
}
}
template<class T>
void DoubleLink<T>::add(T a[],int m)//插入函数
{
for(int i=0; i<m; i++)
{
DNode<T> *s,*p,*f;
s=new DNode<T>;
s->data=a[i];
f=head;
p=head->rlink;
while(p&&a[i]>p->data)
{
f=p;
p=p->rlink;
}
s->rlink=p;
f->rlink=s;
s->llink=f;
if(s->rlink)
s->rlink->llink=s;
}
}
template<class T>
void DoubleLink<T>::del(T a[],int l)//删除函数
{
for(int i=0;i<l;i++)
{
DNode<T> *z;
z = head;
int ge=0;
while(z->rlink)
{
if(z->rlink->data==a[i])
++ge;
z = z->rlink;
}
while(ge>0)
{
int ks=1;
DNode<T> *r;
r = head->rlink;
while(ks==1)
{
if(a[i]==r->data)
ks=0;
else
{
if(r->rlink)
r = r->rlink;
else
ks=0;
}
}
r->llink->rlink=r->rlink;
if(r->rlink)
r->rlink->llink=r->llink;
delete r;
--ge;
}
}
}
template<class T>
void DoubleLink<T>::print()//遍历函数
{
DNode<T> *p;
p=head->rlink;
while(p)
{
cout<<p->data<<" ";
p=p->rlink;
}
cout<<endl;
}
int main()
{
int a[100000],b[100000],c[100000];
int x,y,z;
int n=0,m=0,l=0;
while(cin>>x)
{
if(x==0)
{
break;
}
a[n]=x;
n++;
}
sort(a,a+n);
DoubleLink<int> link(a,n);
link.print();
while(cin>>y)
{
if(y==0)
{
break;
}
b[m]=y;
m++;
}
sort(b,b+m);
link.add(b,m);
link.print();
while(cin>>z)
{
if(z==0)
{
break;
}
c[l]=z;
l++;
}
sort(c,c+l);
link.del(c,l);
link.print();
link.~DoubleLink();
return 0;
}