有序的双链表的实现

描述

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


原文地址:https://www.cnblogs.com/dean-SunPeishuai/p/10545373.html

时间: 2024-08-29 18:35:27

有序的双链表的实现的相关文章

有序的双链表

根据data大小排序(递增): 删除all + 删除1 + 添加1 + 打印all // 双链表 -> 有序双链表(递增) #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> typedef enum{ FALSE = 0, TRUE = 1, }STATUS; typedef struct _DOUBLE_LINK_NODE { int addr

[数据结构]双链表

[cpp] view plaincopy typedef struct NODE{ struct NODE *fwd; struct NODE *bwd; int value; }Node; 双链表的根节点的bwd指针指向双链表的最后一个节点,fwd指针指向双链表的第一个节点,双链表的value字段为空 以下程序是将一个值插入到一个有序的双链表中,如果链表中已经有和该值相同的节点则不插入 [cpp] view plaincopy #include <stdio.h> #include <

双链表&amp;链表合并&amp;多项式相加算法

//单链表的合并 //链表合并 //两个链表必须是有序的 #define Maxsize 5 typedef  int elemtype; typedef struct linklist { elemtype data; struct linklist *next; }Linklist; //建立链表1 Linklist *CreateList1 () { int i,data ; Linklist *head, *p, *q; head=p=(Linklist  *)malloc(sizeof

双链表操作

处理完了单链表,这次处理双链表. 在一个双链表中,每个节点都包含两个指针,指向前一个节点的指针和指向后一个节点的指针.这可以使我们以任何方式遍历双链表,甚至可以忽略前后地在双链表中访问.下面的图示展示了一个双链表: 下面是节点类型的声明文件: double_linked_list_node.h #ifndef _DOUBLE_LINKED_LIST #define _DOUBLE_LINKED_LIST typedef struct NODE{ struct NODE * fwd; struct

双链表的实现

双链表:可以从一个表结点出发,在线性表中随意访问它的前驱结点和后继结点,双链表有两个指针. 双链表结template<class Elem> class Link   private:       static Link<Elem>* freelist ;//Head of the freelis   public: Elem element;//value for this node Link *next;//pointer to next node in list Link *

优先双链表

题目: 设有一个双链表,每个结点中除有prior,data和 next这3个域外,还有一个访问频度域 freq,在链表被启用前其值均初始化为0.每当在在链表上进行一次查找操作Locate(L, x)时,令元素值为x的结点中的freq域的值增加1,并使此链表中的结点保持按访问频度域递减的顺序排列,以便使频繁访问的结点总是靠近表头 (1)首先创建一个双链表. (2) 设计一个符合上述要求的Locate(L, x)函数. (3) 具有输出显示访问频度功能. (4) 要求程序通过一个主菜单进行控制,在主

1216.1——双链表

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循环链表. typedef struct node{ struct node *pre;   //前驱指针 int age; struct node *next;  //后驱指针 }Node; int main(int argc, const char * argv[]) { Node * phead =

双链表优先队列ADT的实现与测试

源代码如下: #include <stdlib.h> #include <stdio.h> typedef struct pq* PQ; typedef struct PQnode* PQlink; struct Item{int data;char c;}; struct PQnode{Item key;PQlink prev,next;}; struct pq{PQlink head,tail;}; PQ PQinit(){ PQ pq = (PQ)malloc(sizeof*

双链表删除/插入节点

//双链表删除节点 dnode *del(dnode *head, int num) { dnode *p1, *p2; p1 = head; while (num != p1->data && p1->next != NULL) { p1 = p1->next; } if (num == p1->data) { if (p1 == head) { head = head->next; head->pre = NULL; free(p1); } else