引言
我们已经介绍了数据结构中的单向链表以及实现了一些接口,我们发现,链表中的一个节点通过一个next指针指向下一个节点,依次传递;如果我们想要找到一个特定的节点,就算我们增加了控制信息,也必定需要从头开始遍历,如果每个节点增加一个向前一个节点的指针,它的每个数据结点中就都有两个指针,分别指向直接后继和直接前驱。我们就会可以很方便地访问它的前驱结点和后继结点。
以此,为双端链表(双向链表)。
本文所有源程序可在double_list得到。
一、双端链表的定义
我们在Dlist_node的结构体中有两个Dlist_node指针的指针域,一个void* 指针指向的数据域。由于void *是可以指向任意数据类型的指针,从而我们实现了双端链表的通用结构。
1 |
|
1 |
|
从而我们得到的双端链表结构如图示:
二、双端链表的接口定义:
我们仍旧定义了对双端链表的操作,如以下接口:
1 |
|
我们将这些信息连同定义的宏定义一齐放入dlist.h中,
1 |
|
三、其他工具类函数定义
所谓工具类,即可以调用的多处可用的工具函数,如malloc的包裹函数,或者交换函数:
1 |
|
实现:
1 |
|
其他对双端链表的有用操作工具:
1 |
|
三、双端链表节点的接口实现
1 |
|
四、程序功能验证
验证程序:
1 |
|
1 |
|
本文所有源程序可在Data_struct /double_list上得到。
总结:
本文简单的实现了较通用的双向链表,其中采用的通用思想不仅仅存在于封装操作,更是旨在使用void *指向的数据域,以及可以拓展的打印方式。
简单的接口,简单的操作,在对链表进行增删查改的时候,应该充分发挥其结构优势。
我们可以发现,作为一种很重要的数据结构,双向链表还是很重要的。今后还将继续对其进行更深一步的讨论。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Aemonair!