链表(list)的宏定义实现

-- 看代码是一种享受

 

  最近在看DHCP的源码,一些好的记录下来。平时写C,用到链表就是copy数据结构上的代码,简单粗暴,今天换种方式,看下宏定义实现的链表,好处自然是代码少、效率高。

 

  首先下面链表宏定义的实现,摘自wide-dhcpv6-20080615源码包 

  比较难理解的可能是LIST_ENTRY中的成员le_prev,它不是平时双向链表中的前向指针(指向前一个元素),而是前向前一个元素的le_next成员的指针(可能比较绕口,下面看图更清楚)。

            

  上图显示了链表头插入两个元素: elem-1和elem-2后指针的指向,注意le_prev指向的是指针的地址,而不是元素的地址。

 

  下面逐一分析:

   1. 声明链表的一项entry结构体, 包含两个成员:计数值(链表的数据部分)counter和指向前后的指针link

               

   2. 声明链表头sn_head

               

                 可能不大好理解,将宏定义展开就很清晰了,其实就是定义了链表头

     

       3. 链表的初始化

              

   4. 再就是使用了,包括了插入、删除、枚举,就不一一列举了

                               

     

        插入做的就是改变前后指针,假如将元素elem2插入到elem1后,elem3前,则将elem1的le_next指针指向elem2,elem2的le_next指针指向elem3;将elem2的le_prev指针指向elem1的成员le_next,将elem3的le_prev指针指向elem2的成员le_next

        删除做的也是改变前后指针,假如从elem1和elem3间删除elem2,则将elem1的le_next指针指向elem3,elem3的le_prev指向elem1的le_next成员

枚举就是顺着链表头向下,仅使用le_next成员即可

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值