有序的双链表的实现
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; }
以上是关于有序的双链表的实现的主要内容,如果未能解决你的问题,请参考以下文章