有序的双链表的实现
总时间限制:
100000ms
内存限制:
655360kB
描述
定义有序的双链表类,链表中存储整型数据,创建带头结点的有序双链表,要求包含以下成员函数:
双链表的构造函数(非空的链表,输入数据为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<iostream>
#include<algorithm>
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)
{
cout<<p->data<<endl;
}
else
{
cout<<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(cin>>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(cin>>first)
{
if(first==0)
break;
D_link.insert(first);
}
D_link.print();
while(cin>>second)
{
if(second==0)
break;
D_link.delete_x(second);
}
D_link.print();
/*D_link.insert(first);
D_link.print();
D_link.delete_x(second);
D_link.print();*/
return 0;
}