一、双向链表的定义及基本操作
单链表中的结点只有一个指向其后继的指针,使得单链表要访问某个结点的前驱结点时,只能从头开始遍历,而双向链表的话 可以直接访问结点的后继结点和前驱结点。
双链表的结点中有两个指针prior和next,分别指向前驱结点和后继结点。
- 定义双向链表
//定义双链表
typedef struct DoubleLNode{
Elem data;//数据域
struct DoubleLNode *prior;//前驱指针
struct DoubleLNode *next;//后继指针
}DLN;
- 初始化双向链表
//初始化链表
void InitLNode(DLN *&L){
L=(DLN *)malloc(sizeof(DLN));//带头节点的链表
L->prior=NULL;
L->next=NULL;
}
- 创建双向链表
创建链表:头插法和尾插法
//尾插法
void CreateLNodeW(DLN *&L,Elem a[],int n){
DLN *s,*p=L;
for(int i=0;i<n;i++){
s=(DLN *)malloc(sizeof(DLN));
s->data=a[i];
if(p->next==NULL){
//头结点的后继结点为空的时侯
s->next = L;// s的后继结点为头结点H
s->prior = L;//s的前驱结点为头结点H
L->next = s;//头结点H的后继结点为s
L->prior=s;//头结点H的前驱结点为s
}
else{
//在最后插入
//最后一个结点为p->prior(头结点的前驱)
p->prior->next=s; //
s->prior=p->prior;
s->next=p;
p->prior=s;
}
}
}
//头插法
void CreateLNodeH(DLN *&L,Elem a[],int n){
DLN *s;
for(int i=0;i<n;i++){
s=(DLN *)malloc(sizeof(DLN));
s->data=a[i];
if(L->next == NULL){
//头结点的后继结点为空的时侯
s->next = L;//s的后继结点为头结点H
s->prior = L;//s的前驱结点为头结点H
L->next = s;//头结点H的后继结点为s
L->prior=s;//头结点H的前驱结点为s
}else{
s->next =L->next;
L->next->prior = s;
s->prior = L;
L->next = s;
}