博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一种链表的实现
阅读量:4703 次
发布时间:2019-06-10

本文共 1003 字,大约阅读时间需要 3 分钟。

  从别人博客总结而来的,主要是受到内核中链表的启发。与常见的链表不同的,这种链表将节点和数据独立:

  struct list_head
  {


        struct list_head *prev,*next;
  };

  struct entry
  {

        struct list_head* list;
        type data;
  };
  用节点做为遍历的iterator,来处理数据。这样做很好得解决了一个问题,那就是如何使一个链表的实现能独立于数据。不同是数据type就不同,按以往的方式,一种数据就得实现一套链表处理。C++中用模板来解决,而内核链表是C,用这种方法来解决。
  数据在节点以外,那怎么访问节点对应的数据呢?
  内核链表提供了这个宏:
  #define list_entry(ptr, type, member) container_of(ptr, type, member)
  而container_of的定义是:
  #define container_of(ptr, type, member) ({ \
   const typeof( ((type *)0)->member ) *__mptr = (ptr); \
   (type *)( (char *)__mptr - offsetof(type,member) );})
  offsetof是我们熟悉的:
  #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
  利用list_head在entry中的位置与list_head的指针,反推出entry的位置。
  使用list_entry的方法:
  如定义了
  struct entry
  {

        struct list_head* list;
        int data;
  }myentry;
  调用
  struct entry* return_value=list_entry(list,struct entry,list);
  则
  return_value==&myentry;

 

转载于:https://www.cnblogs.com/zhangduan/archive/2012/06/16/2551679.html

你可能感兴趣的文章
PHP面向对象(OOP)----分页类
查看>>
监听SD卡状态
查看>>
vs2017 EFCore 迁移数据库命令
查看>>
serialVersionUID的作用
查看>>
liunx trac 插件使用之GanttCalendarPlugin
查看>>
(14)嵌入式软件开发工程师技能要求总结
查看>>
[hackerrank]Closest Number
查看>>
volatile关键字
查看>>
[Android] TabLayout设置下划线(Indicator)宽度
查看>>
<潭州教育>-Python学习笔记@条件与循环
查看>>
web自动化之验证码识别解决方案
查看>>
netty接收大文件的方法
查看>>
软件工程设计之四则运算
查看>>
SpringMVC @ResponseBody 406
查看>>
Partial Tree UVALive - 7190(完全背包)
查看>>
Ubuntu安装搜狗拼音教程
查看>>
Happy Number
查看>>
Sqlserver 系统视图简单说明
查看>>
【摘录】PHP异步调用实现方式
查看>>
php缓存机制
查看>>