双向链表的概念比较简单,只是在之前单链表的的基础上,每个结点多增加了一个指向直接前驱的指针。双向链表的存储结构定义如下:

typedef struct DulNode{

    ElemType data;
    struct DulNode *prior;
    struct DulNode *next;
}DulNode, *DuLinkList;

   双向链表的操作基本上和单链表的操作一模一样。这里,实现一下链表元素的插入操作。比如,插入一个元素s,s之前一个结点是p。那么,只要把s的直接前驱指针指向p,把s的直接后继指针指向p的指向。然后,把p的直接后继指针指向s,把s的下一个结点的直接前驱指针指向s。代码如下:

s->prior = p;
s->next = p->next;
p->next = s;
p->next->prior = s;

   元素的删除操作与元素的插入操作类似。假设删除元素p。代码如下:

p->prior->next = p->next;
p->next->prior = p->prior;
free ( p );    //释放p结点