算法精解二十六(C语言版)

双向链表的实现与分析

双向链表由一个数据成员、一个指向下一个元素的next指针,以及一个指向前一个元素的prev指针组成。数据结构DListElmt代表双向链表中的元素(见示例5-4).如你所料,这个结构体拥有前文描述过的3个成员。数据结构Dist代表双向链表数据结构(见示例5-4),该结构的成员同前面介绍的单链表相似。



Dlist_init

dlist_init操作用来初始化一个双向链表以便稍后能执行其他操作(见示例5-5).初始化过程同单链表一样。dlist_init的运行时复杂度为O(1),因为初始化过程中的所有步骤都能恒定的时间内完成

Dlist_destroy

dlist_destroy操作用来销毁一个双向链表(见示例5-5).总的来说,该操作意味着将链表中的所有元素都移除。当传递给该函数的destroy参数不为NULL时每当一个元素被移除时都将调用dlist_init.

dlist_destroy的运行时复杂度为O(n),这里n代表链表中的元素个数。这是因为对于每个元素的移除操作都需要调用一次复杂度为O(1)的dist_remove函数。

dlist_ins_next

dlist_ins_next操作用来将新元素插入由参数element所指定的元素之后(见示例5-5).双向链表中的插入操作同单链表中的很相似。最大的区别在于除了要管理next指针的指向外,还必须管理prev指针,以保证链表的反向链接关系正确(见图5-6)


dlist_ins_next的复杂度为O(1),因为插入操作的所有步骤均能够在恒定的时间内完成。

dlist_ins_prev

dlist_ins_prev操作用来将新元素插入双向链表中有参数element所指定的元素之前(见示例5-5).双向链表中的插入操作与单链表类似。和dlist_ins_next一样,最大的不同在于除了要管理next指针的指向外,还必须管理prev指针,以保证链表的反向链接关系正确。dlist_ins_prev的运行复杂度为O(1),因为插入操作的所有步骤都能在恒定的时间内完成。

dlist_remove

dlist_remove操作将指定的元素双向链表中移除(见示例5-5).同单链表中移除操作的最大的不同在于除了要管理next指针外,还必须管理prev指针,以保证链表的反向链接关系正确。对于双向链表来说,还有一个不同的地方在于:该接口可以移除当前指定的元素,而不是移除指定元素之后的那个元素,因为每个元素都有一个指向其前驱元素的指针。

dlist_remove的复杂度为O(1),因为所有的操作步骤都能在恒定的时间内完成。


这些宏实现双向链表一些比较简单的操作(见示例5-5).总的来说,这些宏提供了访问和测试数据结构DList以及DLstElemt的成员的接口。

本节中所有的空的运行时复杂度都为O(1),因为访问和检测数据结构中的成员是一个简单的操作,他们都能够在恒定的时间内完成。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值