数据结构——循环链表

1、循环链表的定义
循环链表是一种首尾相连的链表。特点是无需增加存储量,仅对表的链接方式修改使表的处理灵活方便。空循环链表仅由一个自成循环的头结点表示。

2、单向循环链表

在单向链表中,头指针是相当重要的,因为单向链表的操作都需要头指针,所以如果头指针丢失或者破坏,那么整个链表都会遗失,并且浪费链表内存空间。
单向循环链表的构成:如果把单链表的最后一个节点的指针指向链表头部,而不是指向NULL,那么就构成了一个单向循环链表。

3、双向循环链表

在单链表L中,查找ai的后继 Next(L, ai),耗时仅为O(1),因为取ai之后继指针即可。但查找ai的直接前驱Prior(L, ai),则需从链表的头指针开始,找到结点ai前一结点即是。故运算Prior(L,ai)依赖表长n,耗时为O(n)。另外,若链表中有一指针值被破坏,则整个链表脱节。这是单链表的不足,为此,引入双向链表。先定义双向链表中的结点:image其中,data和next同单链表,增加一指针域prior,其指向本结点的直接前驱。
结点描述:
typedef int data_t;
typedef struct dnode_t
{ data_tdata;
struct dnode_t *prior, *next;
}dlinknode_t, *dlinklist_t;

a、双向循环链表插入:即实现在表L的第i结点前插入一结点x的运算。
算法思路:调用查找算法Getlist(L,i),获取结点ai的指针p 。若p存在,申请一q结点,存入元素x,然后修改指针,将q结点插入p结点之前。

b、双向循环链表删除:即实现删除链表中第i结点的运算。
算法思路:调用查找算法GetlLinkist(L, i),获取ai的指针p,若p存在,则修改指针删除之。

原文地址:https://www.cnblogs.com/sanwumanzi/p/10558581.html