循环链表的实现与分析
同单链表一样,循环链表中的每一个元素也包含两部分;一个数据域指针和一个指向后续元素的next指针。数据结构 CListElmt代表循环链表中的单独元素(见示例5-6)。如你所料,这个结构体拥有两个成员,与前面所述的一致。数据结构Clist代表循环链表(见示例5-6).这个结构体同单链表类似,但它不包含tail成员。
clist_init
clist_init操作用来初始化一个循环链表以便稍后能够执行其他操作(见示例5-7).初始化过程同非循环的单链表一样,只是这里循环链表没有tail成员而已。
clist_init的运行时复杂度为O(1),因为初始化过程中的所有步骤都能在恒定的时间内完成。
clist_destroy
clist_destroy用来销毁一个循环链表(见示例5-7)。总的来说,该操作意味着将移除链表中的所有元素。当传递给该函数的destroy不为NULL时,每移除一个元素时都将调用clist_init一次。
clist_ins_next
clist_ins_next用来将新元素插入循环表中由参数element所指定的元素之后(见示例5-7)。将元素插入单向循环链表中的过程同非循环的单链表类似。最大的不同在于当所插入的链表是空链表时。在这种情况下,必须将所插入元素
的next指针设置为指向它自己.这就允许循环遍历只有一个元素的链表。这也确保了之后元素的插入操作能够按照恰当的方式进行。
clist_ins_next的运行时复杂度O(1),因为插入操作中的所有步骤都能够在恒定的时间内完成。
clist_rem_next
clist_rem_next将参数element所不指定的后继元素从链表中移除(见 示例5-7).从单向循环链表中移除元素的过程同非循环的链表类似。
clist_rem_next的运行时复杂度为O(1),因为移除操作中的所有步骤都能够在恒定时间内完成。
Clist_size、clist_head、clist_data以及clist_next这些宏实现循环链表的一些简单操作(见示例5-6)。总的来说,这些宏提供了访问和检测数据结构Clist和ClistElmt中的成员的接口。
以上这些宏的运行时复杂度都为O(1),因为访问和检测数据结构的成员是一种简单的操作,而且它们都能在恒定的时间内完成。