1.循环链表的定义
将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表。(circular linked list)
为了使空链表与非空链表处理一致,我们通常会加一个头结点。并不是循环链表一定需要一个头结点。

其实循环链表和单链表的主要差异就在于循环条件的判断上,原来的判断条件是判断p->next是否为空,现在则是p->next不等于头结点。
2.双向链表的定义
双向链表(double linked List)是在在单链表的每个结点中,再设置一个指向其前驱结点的指针域。
所有的双向链表中的结点都有两个指针域,一个指向其直接后继,另一个指向直接前驱。
/*线性表的双向链表存储结构*/
typedef struct DulNode
{
ElemType data;
struct DuLNode *prior; /*直接前驱指针*/
struct DuLNode *next; /*直接后继指针*/
}DulNode, *DuLInkList;
双向链表同样也可以是循环表。

双向链表的一个特点:
对于链表中的某个结点p,它的后继的前驱以及前驱的后继都是它自己,即:
p->next->prior = p = p->prior->next;