双链表和单链表在原理上是差不多的,就是前后两个数据之间存在两个指针。既可以由前找后,也可以由后找前,说白了就是用空间换时间。下面就是双链表的实现代码:
主类:
struct Node
{
int date;
Node *llink,*rlink;
};
class Shuang
{
Node *first;
public:
Shuang(int a[],int n);
~Shuang();
void add(int b[],int n);
void cut(int c[],int n);
void bianli();
};
功能实现函数
构造函数
Shuang::Shuang(int a[],int n)
{
first=new Node;
first->llink=NULL;
first->rlink=NULL;
Node *s,*p;
p=first;
for(int i=0;i<=n;i++)
{
s=new Node;
s->date=a[i];
s->llink=p;
p->rlink=s;
p=s;
}
p->rlink=NULL;
}
析构函数
Shuang::~Shuang()
{
Node *p=first,*q;
while(p)
{
q=p->rlink;
delete p;
p=q;
}
}
遍历函数
void Shuang::bianli()
{
Node *p=first->rlink;
while(p)
{
cout<<p->date<<" ";
p=p->rlink;
}
}
增加数据
这个函数是最难的,也是最容易出错的,我修改了很多遍,有点麻烦。
void Shuang::add(int b[],int n)
{
Node *p,*s;
int ji=0;
for(int i=0;i<=n;i++)
{
ji=0;
p=first->rlink;
while(p)
{
if(p->date>b[i])
{
p=p->llink;
s=new Node;
s->date=b[i];
s->llink=p;
s->rlink=p->rlink;
p->rlink->llink=s;
p->rlink=s;
ji=1;
break;
}
else
{
p=p->rlink;
}
}
if(ji==0)//比链表中原有的数据都要大,就插入到最后面。
{
p=first->rlink;
while(p)
{
if(p->rlink==nullptr)
{
break;
}
else
{
p=p->rlink;
}
}
s=new Node;
s->date=b[i];
p->rlink=s;
s->llink=p;
s->rlink=NULL;
}
}
}
删除数据
void Shuang::cut(int c[],int n)
{
Node *p,*q;
for(int i=0;i<=n;i++)
{
p=first->rlink;
while(p)
{
q=p->rlink;
if(p->date==c[i])
{
if(p->rlink!=NULL)
{
p->llink->rlink=p->rlink;
p->rlink->llink=p->llink;
delete p;
}
else
{
p->llink->rlink=p->rlink;
}
}
p=q;
}
}
}
总结:
双链表中最总要的部分就是插入以及删除,其他的功能和单链表几乎相似。
一、插入
再节点p的后面插入一个新节点s,总需要修改4个指针:
- s-llink=p;
- s-rlink=p->rlink;
- p->rlink->link=s;
- p->rlink=s;
二、删除
假设删除p节点:
(1) (p-llink)->rlink=p->rlink;
(2) (p-rlink)->llink=p->llink;