zoukankan      html  css  js  c++  java
  • 有序的双链表的实现

    描述

    定义有序的双链表类,链表中存储整型数据,创建带头结点的有序双链表,要求包含以下成员函数:
    双链表的构造函数(非空的链表,输入数据为0,表示输入结束)
    插入操作(将一个数据元素插入到有序的双链表中,插入之后链表仍然有序,输入数据为0表示插入操作结束)
    按值删除节点(考虑有重复值的情况)
    双链表的遍历操作
    双链表的析构

    输入输入链表中的元素,根据输入元素,创建有序双链表(非空的链表,输入数据为0,表示输入结束)
    输入要插入的值(可以插入多个值,0表示输入结束,)
    输入要删除的值(可以删除多个值,0表示结束,)输出输出创建的结果
    输出插入的结果
    输出删除之后的结果样例输入

    1 6 3 7 5 9 0
    8 0
    2 0

    样例输出

    1 3 5 6 7 9
    1 3 5 6 7 8 9
    1 3 5 6 7 8 9
    代码:
    #include<bits/stdc++.h>
    using namespace std;
    struct Node
    {
        int data;
        Node *L;
        Node *R;
    };
    class Dlinklist
    {
    public:
        Dlinklist(int a[],int n);
        void delete_x(int x);
        void print();
        void insert(int x);
        ~Dlinklist();
    private:
        Node *head;
    };
    int a[1000];
    Dlinklist::Dlinklist(int a[],int n)
    {
        Node *s,*p;
        s=new Node;
        s->L=NULL;
        s->R=NULL;
        head=s;
        p=head;
        for(int i=1;i<=n;i++)
        {
            s=new Node;
            s->L=p;
            s->data=a[i];
            p->R=s;
            p=s;
        }
        p->R=NULL;
    }
    void Dlinklist::delete_x(int x)
    {
        Node *p,*q;
        p=head->R;
        while(p)
        {
            if(p->data==x)
            {
                q=p;
                p->L->R=p->R;
                if(p->R!=NULL)
                   p->R->L=p->L;
                delete q;
            }
            p=p->R;
        }
    }
    void Dlinklist::insert(int x)
    {
        Node *p,*s;
        p=head->R;
        int flag=1;
        while(p)
        {
            if(p->data>=x)
            {
                s=new Node;
                s->data=x;
                s->R=p;
                s->L=p->L;
                p->L->R=s;
                p->L=s;
                flag=0;
                break;
            }
            p=p->R;
        }
        if(flag)///此处特判一下插入的值是否是最大的,如果是则前面并没有插入,需要尾插
        {
            Node *p,*s;
            p=head;
            while(p->R)///找到尾节点
            {
                p=p->R;
            }
            s=new Node;
            s->data=x;
            s->R=p->R;
            p->R=s;
            s->L=p;
        }
    
    }
    void Dlinklist::print()
    {
        Node *p;
        p=head->R;
        while(p)
        {
            if(p->R==NULL)
            {
                printf("%d
    ",p->data);
            }
            else
            {
                printf("%d ",p->data);
            }
            p=p->R;
        }
    }
    Dlinklist::~Dlinklist()
    {
        Node *p;
        p=head->R;
        while(p)
        {
            delete head;
            head=p;
            p=p->R;
        }
    }
    int main()
    {
        int x,j=0;
        while(scanf("%d",&x))
        {
            if(x==0) break;
            a[++j]=x;
        }
        sort(a+1,a+1+j);
        Dlinklist D_link(a,j);
        D_link.print();
        int first,second;
        while(scanf("%d",&first))
        {
            if(first==0)
              break;
              D_link.insert(first);
    
        }
        D_link.print();
        while(scanf("%d",&second))
        {
            if(second==0)
              break;
            D_link.delete_x(second);
        }
        D_link.print();
        return 0;
    }


  • 相关阅读:
    Express入门
    nodejs入门
    css实现点点点效果
    定时器详解和应用、js加载阻塞、css加载阻塞
    栈内存和堆内存有什么区别?
    webpack入门
    Ubuntu常用命令集合
    HTTP缓存机制
    125. 验证回文字符串
    算法的时间复杂度和空间复杂度(js版)
  • 原文地址:https://www.cnblogs.com/dean-SunPeishuai/p/10545373.html
Copyright © 2011-2022 走看看