雙鏈表和單鏈表在原理上是差不多的,就是前後兩個數據之間存在兩個指針。既可以由前找後,也可以由後找前,說白了就是用空間換時間。下面就是雙鏈表的實現代碼:
主類:
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;