有序的双链表的实现

Posted dean-sunpeishuai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有序的双链表的实现相关的知识,希望对你有一定的参考价值。

描述

定义有序的双链表类,链表中存储整型数据,创建带头结点的有序双链表,要求包含以下成员函数:
双链表的构造函数(非空的链表,输入数据为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;
}

 



以上是关于有序的双链表的实现的主要内容,如果未能解决你的问题,请参考以下文章

Java实现单双链表的基本操作

数据结构-编程实现一个双链表的建立,双链表的打印,双链表的测长

双链表的实现

数据结构 双链表的简单理解和基本操作

基础数据结构---双链表go语言的代码实现

基础数据结构---双链表go语言的代码实现