双链表

在双向链表中既有前向链又有后向链,寻找任一个结点的直接前驱结点与直接后继结点变得非常方便。

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值