双链表VS单链表
单链表:由于只有指向后继结点的指针,无法逆向检索,有时候不太方便
双链表:在单链表的基础上,加上了指向前驱结点的指针
初始化(带头结点)
# include<iostream>
typedef struct DNode
{
int data;
struct DNode *prior, *next;
}DNode, *DLinkList;
// 初始化双链表
bool InitDLinkList(DLinkList &L){
L = (DNode *)malloc(sizeof(DNode));
if (L==NULL) // 内存不足,分配失败
return false;
L->prior=NULL; // 头结点的prior永远指向NULL
L->next=NULL; // 头结点之后暂时还没有结点
return true;
}
// 判断双链表是否为空
bool Empty(DLinkList L){
if(L->next == NULL)
return true;
else
return false;
}
双链表的插入
// 在p结点后插入s结点
bool InsertNextDNode(DNode *p, DNode *s){
if(p==NULL||s==NULL) // 非法参数
return false;
s->next=p->next;
if(p->next!=NULL) // 如果p结点有后继结点
p->next->prior=s;
s->prior=p;
p->next=s;
}
双链表的删除
// 双链表的删除
void DestoryList(DLinkList &L){
// 循环释放各个数据结点
while (L->next!=NULL)
DeleteNextDNode(L);
free(L); // 释放头结点
L=NULL; // 头指针指向NULL
}
bool DeleteNextDNode(DNode *p){
if(p==NULL) return false;
DNode *q=p->next;
if(q==NULL) return false;
p->next =q->next;
if(q->next!=NULL)
q->next->prior=p;
free(q);
return true;
}
双链表的遍历
以上就是双链表的基本操作,欢迎讨论和指正!