深入浅出linux内核源代码之双向链表listhead(list-h).pdfVIP

深入浅出linux内核源代码之双向链表listhead(list-h).pdf

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
深入浅出 linux 内核源代码之双向链表list_head 原创文章,转载请注明出处,谢谢! 作者:清林,博客名:飞空静渡 范金宝 email:fjb2080@163.com blog:/fjb2080 前言:在linux源代码中有个头文件为list.h。很多linux下的源代码都会使用这个头文件,它里面定义 了一个结构,以及定义了和其相关的一组函数,这个结构是这样的: struct list_head{ struct list_head *next, *prev; }; 那么这个头文件又是有什么样的作用呢,这篇文章就是用来解释它的作用,虽然这是linux下的源代码,但对 于学习C语言的人来说,这是算法和平台没有什么关系。 一、双向链表 学习计算机的人都会开一门课程《数据结构》,里面都会有讲解双向链表的内容。 什么是双向链表,它看起来是这样的: struct dlist { int no; void* data; struct dlist *prev, *next; }; 它的图形结构图如下: prev no data next prev no data next /fjb2080 prev no data next prev no data next 如果是双向循环链表,那么就加上虚线所示。 现在有几个结构体,它们是: 表示人的: struct person { int age; int weight; }; 表示动物的: struct animal { int age; int weight; }; 如果有一组filename 变量和filedata 变量,把它们存起来,我们会怎么做,当然就用数组了,但我们想使 用双向链表,让它们链接起来,那该怎么做,唯一可以做的就是给每个结构加如两个成员,如下: 表示人的: struct person { int age; int weight; struct person *next, *prev; }; 表示动物的: struct animal { int age; int weight; struct animal *next, *prev; }; 现在有一个人的一个链表的链头指针person_head (循环双向链表)和动物的链表的链头指针 ainimal_head ,我们要获得特定年龄和特定体重的人或动物(假设不考虑重叠),那么代码看起来可能是这 样: struct person * get_percent(int age, int weight) { … struct person *p; for(p = person_head-next; p != person_head; p=p-next) { if(p-age == age p-weight == weight) return p; } …... } 那同理,要获得一个特定年龄和重量的动物的函数get_animal(int age, int weight)的代码也是和上面 的类似。 如果我们定义这样的两个函数,它们基本一样,会不会觉得有点冗余,如果是c++就好了,但这里只说c。 如果我们仔细观察一下这两个结构,我们会发现它们出了类型名字不一样外,其它的都一样。那么我们考虑用 一个宏来实现,这个宏看起来可能是这样的。 #define get_one(list, age, weight, type, one) \ do \ {\ type *p;\ for(p = ((type*)list)-next; p != (type*)list; p=p-nex

文档评论(0)

xina171127 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档