双链表
双链表的初始化(带头结点)
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 true;
}
双链表的插入
//在p结点之后插入s结点
bool InsertNextDNode(DNode *p, DNode *s){
if(p==NULL || s==NULL)//非法传参
return false;
s-next=p->next;//将结点*s插入到结点*p之后
if(p->next != NULL)//如果p有后继结点
p-next->prior=s;
s->prior=p;
p->next=s;
}
双链表的删除
//删除p结点的后继结点
bool DeleteNextDNode(DNode *p){
if(p==NULL)
return false;
DNode *q = p->next;//找到p的后继结点
if(q==NULL)
retrun false;//p没有后继结点
if(q->next!=NULL){//q结点不是最后一个结点
q->next-prior = p;
}
free(q);//释放结点空间
return true;
}
双链表遍历
//向后
while(p!=NULL){
p=p->next;
}
//向前
while(p!=NULL){
p=p->prior;
}
总结:
-
初始化:头结点的prior、next都指向NULL
-
插入(后插):注意新插入结点、前驱结点、后继结点的指针修改;
边界情况:新插入结点在最后一个位置,需特殊处理
-
删除(后删):注意删除结点的前驱结点、后继结点的指针修改
边界情况:如果被删除结点是最后一个数据结点,需特殊处理
-
遍历:从一个给定节点开始,向后遍历、向前遍历的实现(循环的终止条件)
链表不具备随机存储特性,查找只能通过顺序遍历实现