双链表知识点


本节概述 本节知识点 本节总结

二、双链表

单链表的主要不足之处是:link字段仅仅指向后继结点,不能有效地找到前驱。为弥补了上述不足之处,引入了双链表。其思路是:为每个结点增加一个指向前驱的指针。双链表示意图如下图:

 
    
   

双链表及其结点类型的说明如下:
struct DblListNode {
        ELEM data;
        DblListNode *rlink;
        DblListNode *llink;
};
struct DoubleList {
        DblListNode * first,* last;
};
      双链表删除结点时,如果要删除指针变量p所指的结点,只需修改该结点前驱的rlink字段和该结点后继的llink字段,即
p->llink->rlink = p->rlink;
p->rlink->llink = p->llink;
    然后把变量p所指内容清空,再把p所指空间释放即可。
p->rlink = NULL;
p->llink = NULL;
delete p;
      双链表插入结点时,如果要在p所指结点后插入一个新结点,首先执行new q开辟结点空间。然后,让该新结点的rlink填入p所指的后继地址,新结点的llink填入p所指结点的后继的llink字段,即
new q;
q->rlink = p->rlink;
q->llink = p->rlink->llink;
    此外,要把新结点的地址填入原p所指结点的rlink字段,而且新结点后继的llink字段也应该回指新结点。
p->rlink = q;
q->rlink->llink = q;