内嵌双向链表的设计与实现
前一篇文章《双向链表,还能这么实现》,介绍了双向链表如何彻底消除内部的 NULL 指针,从而代码实现更加简洁,并且不增加任何额外的内存。
实际项目中,对双向链表的需求场景非常多,并且有很多变体的实现。今天介绍内嵌双向链表。先说说场景的需求:
双向链表的经典实现结构,如下图所示:
链表本身维护各个节点,业务使用者需要将自己的数据结构以指针的方式放入链接节点中。
这意味着,向链表增加一个数据,需要做两次内存分配:一次是链表节点自身的内存分配,另一次是业务数据结构的内存分配。
在一些对性能要求严苛的场景中,希望尽可能减少内存分配的次数。因此,我们希望将链表节点直接嵌入至业务的数据结构中,通过内嵌的链表节点,实现将多个业务数据结构链接成一个链表。
用下图展示一下这个需求:
上图用 elist 代表 embed list(内嵌链表)。链表的每个节点,都内嵌在业务的数据结构中,通过链表节点形成一个首尾相连的链表环。
链表中的业务数据结构,通常为同一类型,并且大小都是相同的。更严格的说,是链表节点相对业务数据结构开始地址的偏移是相同的。因此,elist 初始化时需要提供链表节点相对业务数据结构的偏移量,这样就能在业务数据结构和链表节点之间进行互相转换。
elist 的代码实现,如下:
复制代码
elist.c 的代码,如下:
复制代码
测试程序 test_elist.c, 代码如下:
复制代码
运行 ./test_elist, 输出结果如下:
复制代码
我的微信号 "实力程序员",欢迎大家关注我。
版权声明: 本文为 InfoQ 作者【实力程序员】的原创文章。
原文链接:【http://xie.infoq.cn/article/d16b67c8ee49498c3c19d1df2】。文章转载请联系作者。
评论