前言
单链表无法逆向检索,而双链表可进可退,相比较而言存储密度更低一些
一、初始化(带头结点)
typedef struct DNode{
ElemType 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 ture;
}
//判断双链表是否为空
bool IsEmpty(DLinklist L){
return(L->next==NULL)
}
void testDLinklist(){
DLinklist L;
InitDlinklist();
//后续代码省略
}
二、插入
//双链表的插入
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;
return ture;
}
三、删除和销毁
//双链表的删除
bool DeleteNextDNode(DNode *p){
if(p==NULL)
return false;
DNode *q=p->next; //找到p的后继结点q
if(q==NULL) return false; //p没有后继结点
p->next=q->next;
if(q->next!=NULL)
q->next->prior=p;
free(q);
return ture;
}
//双链表的销毁
void DestoryList(DLinklist &L){
//循环释放各个结点
while(L->next!=NULL){
DeleteNextDNode(L);
}
free(L); //释放头结点
L=NULL; //头指针指向NULL
}
四、遍历
//双链表的遍历
//后向遍历
while(p!=NULL){
p=p->next; //针对按位查找只需要加一个计数器,按值查找需要进行对比
}
//前向遍历
while(p!=NULL){
p=p->prior;
}
//前向遍历(跳过头结点)
while(p->prior!=NULL){
p=p->prior;
}
总结
注意边界处理,对于最后一个结点需要进行特殊处理,对于双链表也需要顺序遍历进行查找