经常使用的linux内核双向链表API介绍

linux link list结构图例如以下:

内核双向链表的在linux内核中的位置:/include/linux/list.h

使用双向链表的过程,主要过程包括创建包括struct link_head结构的结构体(item),建立链表头。向链表中加入item(自己定义数据结构。双向链表数据单元)。删除链表节点。遍历链表,判空等。

1、建立自己定义链表数据结构

  1. struct kool_list{
  2. int to;
  3. struct list_head list;
     //包括链表头
  4. int from;
  5. };//自己定义欲链接的数据额结构。并包括双向链表结构

2、建立链表头

  1. struct kool_list mylist;
  2. INIT_LIST_HEAD(&mylist.list);//初始化一个链表表头

或者

static LIST_HEAD(adc_host_head);//初始化一个链表头adc_host_head

另外一种创建链表头和第一种的差别在于,另外一种在编译的时候才会被初始化。

另一点就是链表头是独立的还是位于自己定义链表数据结构中的。就好比在《例说Linux内核链表(二)》中给出的链表结构图和本文给出的结构图的差别。

3、向链表加入item

list_add(struct list_head *new, struct list_head *head);

比如:

  1. struct kool_list *tmp;
  2. tmp= (struct kool_list *)malloc(sizeof(struct kool_list));
  3. printf("enter to and from:");
  4. scanf("%d %d", &tmp->to, &tmp->from);  //初始化数据结构
  5. /* add the new item 'tmp' to the list of items in mylist */
  6. list_add(&(tmp->list), &(mylist.list));//项链表中加入新的元素节点,tmp中的list

list_add_tail(struct list_head *new, struct list_head *head);

在链表的尾部加入一个item,和list_add的差别在于,list_add把新的item加到了链表头的后面,list_add_tail把item加到了链表头的前面。

4、遍历链表

list_for_each_entry(type *cursor, struct list_head *list, member)

这并非一个函数。它是一个for循环,依次列出要遍历的链表。三个元素代表的意义:type *cursor代表item的指针,struct list_head *list是链表头,member是item中包括的list_head数据项。

通过这三个数据能够定位到链表的每个数据元素。当中定位原理就是结构体偏移。

比如:

  1. list_for_each_entry(tmp, &mylist.list, list)
  2. printf("to= %d from= %d\n", tmp->to, tmp->from);

这个宏能够分为两步,第一步是遍历链表,pos依次指向链表中每一个item的struct
list_head 结构,第二步是获取pos指向的struct list_head所在的item。

这里是tmp 。

list_for_each(pos, &mylist.list){//遍历链表,pos依次指向链表的元素

tmp= list_entry(pos, struct kool_list, list);//获得包括pos节点的数据结构指针

5、删除

删除链表中的某节点,首先要使用安全遍历,然后再删除。

比如:

  1. list_for_each_safe(pos, q, &mylist.list){
  2. tmp= list_entry(pos, struct kool_list, list);
  3. printf("freeing item to= %d from= %d\n", tmp->to, tmp->from);
  4. list_del(pos);

6、链表空

int list_empty(struct list_head *head);

Returns a nonzero value if the given list is empty.

參考站点:http://www.makelinux.net/ldd3/chp-11-sect-5

例说Linux内核链表(三)的更多相关文章

  1. 例说Linux内核链表(一)

    介绍 众所周知,Linux内核大部分是使用GNU C语言写的.C不同于其它的语言,它不具备一个好的数据结构对象或者标准对象库的支持. 所以能够借用Linux内核源代码树的循环双链表是一件非常值得让人高 ...

  2. 深入分析 Linux 内核链表--转

    引用地址:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/index.html 一. 链表数据结构简介 链表是一种常用的组织有序数据 ...

  3. linux内核链表分析

    一.常用的链表和内核链表的区别 1.1  常规链表结构        通常链表数据结构至少应包含两个域:数据域和指针域,数据域用于存储数据,指针域用于建立与下一个节点的联系.按照指针域的组织以及各个节 ...

  4. 深入分析 Linux 内核链表

    转载:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/   一. 链表数据结构简介 链表是一种常用的组织有序数据的数据结构,它通过指 ...

  5. Linux 内核链表的使用及深入分析【转】

    转自:http://blog.csdn.net/BoArmy/article/details/8652776 1.内核链表和普通链表的区别 内核链表是一个双向链表,但是与普通的双向链表又有所区别.内核 ...

  6. Linux内核链表——看这一篇文章就够了

    本文从最基本的内核链表出发,引出初始化INIT_LIST_HEAD函数,然后介绍list_add,通过改变链表位置的问题引出list_for_each函数,然后为了获取容器结构地址,引出offseto ...

  7. Linux 内核 链表 的简单模拟(1)

    第零章:扯扯淡 出一个有意思的题目:用一个宏定义FIND求一个结构体struct里某个变量相对struc的编移量,如 struct student { int a; //FIND(struct stu ...

  8. linux内核链表的移植与使用

    一.  Linux内核链表为双向循环链表,和数据结构中所学链表类似,具体不再细讲.由于在内核中所实现的函数十分经典,所以移植出来方便后期应用程序中的使用. /********************* ...

  9. linux内核链表的使用

    linux内核链表:链表通常包括两个域:数据域和指针域.struct list_head{struct list_head *next,*prev;};include/linux/list.h中实现了 ...

随机推荐

  1. md5 c# unicode 互换(原创)

    php 代码 $input='中国'; $result= md5($input); $temp=iconv("UTF-8", "UTF16LE", $input ...

  2. [HTML5] 让IE支持HTML5的方法

    越来越多的站点开始使用 HTML5 标签,但是目前的情况是还有很多人在使用IE6.IE7.IE8.为了让所有浏览者都可以正常的访问,解决方案有下面两个: 1.为网站创建多套模板,通过程序对User-A ...

  3. 如何让音频跟视频在ios跟android上自动播放

    如何让音频跟视频在ios跟android上自动播放 <audio autoplay ><source src="audio/alarm1.mp3" type=&q ...

  4. 关于H5优化的一些问题

    required修改默认提示  : <form action="abc.php"> <input type="text" required o ...

  5. OC数组和字典中存入niu值

    在NSArray和NSDictionary中nil有特殊的含义.但是某些时候,我们必须要放入nil怎么办? 要想放入nil就必须用到一个类NSNull,这个类只有一个类方法,就是null.[NSNul ...

  6. js原生_获取url键值对

    思路: 1.先对url进行处理,获取 ?后的字符串 postid=10457794&actiontip=保存修改成功') 2. 字符串通过&标识,不同参数转为数组 ["pos ...

  7. 杭电2061WA 01

    #include<stdio.h> struct mem { char s[50]; double c; double f; }; int main() { struct mem x[60 ...

  8. PhotoZoom Classic 7怎么样?对电脑和系统要求高不高?

    PhotoZoom Classic 7怎么样?对电脑和系统要求高不高? 相较于更专业PhotoZoom Pro,标准版本的PhotoZoom Classic 7更适用于日常工作中的图片放大处理,例如在 ...

  9. VMware ESXi定制版(OEM ISO)资源下载(包含5.1\5.5\6.0)

     一.VMware ESXi 5.1.0 update03 1.VMware-ESXi-5.1.0-Update3-2323236-hitachi-0400.iso(日立) 2.VMware-ESXi ...

  10. 反射API提供的常用类和函数

    ReflectionParameter 取回了函数或方法参数的相关信息. {//要自行检查函数的参数,首先创建一个 ReflectionFunction 或 ReflectionMethod 的 实例 ...