数据结构之双链表
- 什么是双链表:单链表节点中只有一个指向其后继的指针,使得单链表只能从头节点依次顺序地向后遍历。要访问某个节点的前驱节点,只能从头开始遍历,这样访问后继节点的时间复杂度为O(1),访问前驱节点的时间复杂度为O(n)。为了克服上述缺点,引入双链表,双链表节点中有两个指针prior和next,分别指向其前驱节点和后继节点。
- 双链表节点类型描述:
typedef struct LNode{
Student data;
LNode* next;
LNode* prior;
}LNode,*LinkList;
- 双链表的初始化:
int InitList(LinkList &L){
L=new LNode;
L->next=NULL;
L->prior=NULL;
return OK;
}
- 创建双链表
int Input1(LinkList &L,int x){
LNode* p=L;
while (x--){
LNode* s=new LNode;
cin>>s->data.number>>s->data.name;
s->next=NULL;
p->next=s;
s->prior=p;
p=s;
}
return OK;
}
int Input2(LinkList &L,int x){
while (x--){
if(L->next==NULL){
LNode* s=new LNode;
cin>>s->data.number>>s->data.name;
s->next=L->next;
L->next=s;
s->prior=L;
continue;
}
LNode* s=new LNode;
cin>>s->data.number>>s->data.name;
s->next=L->next;
L->next->prior=s;
s->prior=L;
L->next=s;
}
return OK;
}
- 双链表的插入
int Insert(LinkList &L,int Loc){
LNode* p=L;
if(Loc<=0||Loc>Length(L)+1){
return ERROR;
}
for(int i=0;i< Loc-1;i++)
p=p->next;
if(!p->next){
LNode* s=new LNode ;
cin>>s->data.number>>s->data.name;
s->next=p->next;
p->next=s;
s->prior=p;
return OK;
}
LNode* s=new LNode ;
cin>>s->data.number>>s->data.name;
s->next=p->next;
p->next->prior=s;
p->next=s;
s->prior=p;
return OK;
}
- 双链表的删除
int Delete(LinkList &L,int Loc){
LNode* p=L;
if(Loc<=0||Loc>Length(L))
return ERROR;
for(int i=0;i<Loc;i++){
p=p->next;
}
if(!p->next){
p->prior->next=p->next;
delete p;
return OK;
}
p->prior->next=p->next;
p->next->prior=p->prior;
delete p;
return OK;
}
- 代码汇总
#include "iostream"
using namespace std;
const int OK=1;
const int ERROR=0;
typedef struct Student{
int number;
char name[20];
}Student;
typedef struct LNode{
Student data;
LNode* next;
LNode* prior;
}LNode,*LinkList;
int InitList(LinkList &L){
L=new LNode;
L->next=NULL;
L->prior=NULL;
return OK;
}
int Length(LinkList L){
LNode* p=L;
int length=0;
while (p->next){
p=p->next;
length++;
}
return length;
}
int Input1(LinkList &L,int x){
LNode* p=L;
while (x--){
LNode* s=new LNode;
cin>>s->data.number>>s->data.name;
s->next=NULL;
p->next=s;
s->prior=p;
p=s;
}
return OK;
}
int Input2(LinkList &L,int x){
while (x--){
if(L->next==NULL){
LNode* s=new LNode;
cin>>s->data.number>>s->data.name;
s->next=L->next;
L->next=s;
s->prior=L;
continue;
}
LNode* s=new LNode;
cin>>s->data.number>>s->data.name;
s->next=L->next;
L->next->prior=s;
s->prior=L;
L->next=s;
}
return OK;
}
int Output(LinkList L){
LNode* p=L;
while (p->next!=NULL){
cout<<p->next->data.number<<" "<<p->next->data.name<<endl;
p=p->next;
}
return OK;
}
int Insert(LinkList &L,int Loc){
LNode* p=L;
if(Loc<=0||Loc>Length(L)+1){
return ERROR;
}
for(int i=0;i< Loc-1;i++)
p=p->next;
if(!p->next){
LNode* s=new LNode ;
cin>>s->data.number>>s->data.name;
s->next=p->next;
p->next=s;
s->prior=p;
return OK;
}
LNode* s=new LNode ;
cin>>s->data.number>>s->data.name;
s->next=p->next;
p->next->prior=s;
p->next=s;
s->prior=p;
return OK;
}
int Delete(LinkList &L,int Loc){
LNode* p=L;
if(Loc<=0||Loc>Length(L))
return ERROR;
for(int i=0;i<Loc;i++){
p=p->next;
}
if(!p->next){
p->prior->next=p->next;
delete p;
return OK;
}
p->prior->next=p->next;
p->next->prior=p->prior;
delete p;
return OK;
}
int main(){
int x;
cin>>x;
LinkList L;
InitList(L);
Input1(L,x);
Output(L);
Insert(L,4);
Output(L);
cout<<"\n";
Delete(L,4);
Output(L);
return 0;
}