- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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
                您可能关注的文档
最近下载
- 电力分析软件:PSSE二次开发all.docx VIP
- 冠脉介入培训试题及答案.docx VIP
- 电力调度软件:PSSE二次开发all.docx VIP
- 电力分析软件:PSSE二次开发_(4).PSSE编程环境与语言.docx VIP
- 电力调度软件:PSSE二次开发_(6).PSSE高级功能与优化.docx VIP
- 电力调度软件:PSSE二次开发_(3).Python在PSSE中的应用.docx VIP
- 电力分析软件:PSSE二次开发_(24).未来电力系统趋势与PSSE的发展.docx VIP
- 既有管线保护专项施工方案(已审批).doc
- 不同人群的运动处方.pptx VIP
- 电力调度软件:PSSE二次开发_(5).PSSE案例分析与实践.docx VIP
 原创力文档
原创力文档 
                        

文档评论(0)