例说Linux内核链表(三)
经常使用的linux内核双向链表API介绍
linux link list结构图例如以下:
内核双向链表的在linux内核中的位置:/include/linux/list.h
使用双向链表的过程,主要过程包括创建包括struct link_head结构的结构体(item),建立链表头。向链表中加入item(自己定义数据结构。双向链表数据单元)。删除链表节点。遍历链表,判空等。
1、建立自己定义链表数据结构
- struct kool_list{
- int to;
- struct list_head list;
//包括链表头 - int from;
- };//自己定义欲链接的数据额结构。并包括双向链表结构
2、建立链表头
- struct kool_list mylist;
- 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);
比如:
- struct kool_list *tmp;
- tmp= (struct kool_list *)malloc(sizeof(struct kool_list));
- printf("enter to and from:");
- scanf("%d %d", &tmp->to, &tmp->from); //初始化数据结构
- /* add the new item 'tmp' to the list of items in mylist */
- 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数据项。
通过这三个数据能够定位到链表的每个数据元素。当中定位原理就是结构体偏移。
比如:
- list_for_each_entry(tmp, &mylist.list, list)
- 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、删除
删除链表中的某节点,首先要使用安全遍历,然后再删除。
比如:
- list_for_each_safe(pos, q, &mylist.list){
- tmp= list_entry(pos, struct kool_list, list);
- printf("freeing item to= %d from= %d\n", tmp->to, tmp->from);
- list_del(pos);
6、链表空
Returns a nonzero value if the given list is empty.
參考站点:http://www.makelinux.net/ldd3/chp-11-sect-5
例说Linux内核链表(三)的更多相关文章
- 例说Linux内核链表(一)
介绍 众所周知,Linux内核大部分是使用GNU C语言写的.C不同于其它的语言,它不具备一个好的数据结构对象或者标准对象库的支持. 所以能够借用Linux内核源代码树的循环双链表是一件非常值得让人高 ...
- 深入分析 Linux 内核链表--转
引用地址:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/index.html 一. 链表数据结构简介 链表是一种常用的组织有序数据 ...
- linux内核链表分析
一.常用的链表和内核链表的区别 1.1 常规链表结构 通常链表数据结构至少应包含两个域:数据域和指针域,数据域用于存储数据,指针域用于建立与下一个节点的联系.按照指针域的组织以及各个节 ...
- 深入分析 Linux 内核链表
转载:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/ 一. 链表数据结构简介 链表是一种常用的组织有序数据的数据结构,它通过指 ...
- Linux 内核链表的使用及深入分析【转】
转自:http://blog.csdn.net/BoArmy/article/details/8652776 1.内核链表和普通链表的区别 内核链表是一个双向链表,但是与普通的双向链表又有所区别.内核 ...
- Linux内核链表——看这一篇文章就够了
本文从最基本的内核链表出发,引出初始化INIT_LIST_HEAD函数,然后介绍list_add,通过改变链表位置的问题引出list_for_each函数,然后为了获取容器结构地址,引出offseto ...
- Linux 内核 链表 的简单模拟(1)
第零章:扯扯淡 出一个有意思的题目:用一个宏定义FIND求一个结构体struct里某个变量相对struc的编移量,如 struct student { int a; //FIND(struct stu ...
- linux内核链表的移植与使用
一. Linux内核链表为双向循环链表,和数据结构中所学链表类似,具体不再细讲.由于在内核中所实现的函数十分经典,所以移植出来方便后期应用程序中的使用. /********************* ...
- linux内核链表的使用
linux内核链表:链表通常包括两个域:数据域和指针域.struct list_head{struct list_head *next,*prev;};include/linux/list.h中实现了 ...
随机推荐
- SQL Server 2005外围应用配置器
在SQL Server Configuration Manager中,重启“SQL Server(SQL2005)”服务.
- php Aes 128位算法
<?php class Mcrypt { private static $key = "fsdjfojojodjiovjojgfosdjfiojio"; private st ...
- 修改python的pip下载源
推荐两个源: 豆瓣:http://pypi.douban.com/simple/ 清华:https://pypi.tuna.tsinghua.edu.cn/simple 使用方法有两种,一种为临时使用 ...
- 9.14[XJOI] NOIP训练33
今日9.14 洛谷打卡:大凶!!!(换个字体玩玩qwq) -------------------------------------------------------- 一个超颓的上午 今天又是fl ...
- spring boot的项目结构问题
问题:spring boot项目能够正常启动,但是在浏览器访问的时候会遇到404的错误,Whitelable Error Page 404 分析及解决方案:首先Application文件要放在项目的外 ...
- (转) shiro权限框架详解06-shiro与web项目整合(上)
http://blog.csdn.net/facekbook/article/details/54947730 shiro和web项目整合,实现类似真实项目的应用 本文中使用的项目架构是springM ...
- jquery里面的一些方法
Event 函数 绑定函数至 $(document).ready(function) 将函数绑定到文档的就绪事件(当文档完成加载时) $(selector).click(function) 触发或将函 ...
- 洛谷P3807 【模板】卢卡斯定理_组合数学模板
Code: #include<cstdio> using namespace std; typedef long long LL; const int maxn=1000000+2; LL ...
- select的option触发事件
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
- css3实现滚动手表
静态html: <!DOCTYPE html><html> <head> <meta charset="utf-8" /> < ...