描述
定义有序的双链表类,链表中存储整型数据,创建带头结点的有序双链表,要求包含以下成员函数:
双链表的构造函数(非空的链表,输入数据为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
AC代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<stdlib.h>
#include<queue>
#include<set>
#include<map>
#include<iomanip>
#include<math.h>
using namespace std;
typedef long long ll;
typedef double ld;
const int INF=0x3f3f3f3f;
int i,j,k;
int n,m,t;
int x,y;
int u,v,w;
int ans,res,cnt,temp,sum;
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;
}