精华内容
下载资源
问答
  • linux内核链表

    2018-09-22 13:59:32
    博客详细讲解Linux内核链表,教你看懂Linux内核链表与普通链表有什么不一样
  • LINUX内核链表

    2017-07-18 13:03:09
    Linux 内核链表

    链表简介

    链表是一种常用的数据结构,它通过指针将一系列数据节点连接成一条数据链。相对于数组,链表具有更好的动态性,建立链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位置实时插入或删除数据。链表的开销主要是访问的顺序性和组织链的空间损失。

    链表的种类有很多:
    单向链表、双向链表、循环链表等等。

    Linux内核链表属于双向循环链表。

    传统链表与Linux内核链表的区别:
    传统链表一个节点包含数据域和指针域,指针域指向的位置往往时下一个或上一个节点的开始位置。传统链表的一个缺陷就是每个节点的数据域的数据类型是相同的,用户无法给每个节点安排不同的数据类型。

    Linux内核链表解决了上述缺陷,它的指针域的指针指向的位置时下一个或上一个节点指针域的开始位置,这样用户可以任意指定数据域的数据类型。指针域的类型时统一的。

    内核链表

    结构:

    struct list_head
    {
        struct list_head *next, *prev;
    };

    list_ head 结构包含两个指向 list_head 结构的指针prev和next,由此可见,内核的链表具备双链表功能,实际上,通常它都组织成双向循环链表。

    函数:
    1、 INIT_ LIST_HEAD:创建链表
    2、 list_ add:在链表头插入节点
    3、 list_ add_tail:在链表尾插入节点
    4、 list_ del:删除节点
    5、 list_ entry:取出节点
    6、 list_ for_ each:遍历链表

    代码编写

    mylist.c文件

    #include <linux/init.h>
    #include <linux/module.h>
    #include <linux/list.h> //使用内核链表需要的头文件
    
    struct score//自定义结构体,学生的学号和成绩
    {
        int number;//数据域
        int english;
        int math;
        struct list_head list;//指针域
    };
    
    struct list_head score_head;//定义链表头结点
    struct score stu1, stu2, stu3, *tmp; 
    struct list_head *pos; //用于遍历链表的指针
    
    static int mylist_list()
    {
        //创建链表
        INIT_LIST_HEAD(&score_head); //创建链表,参数是头结点指针域的地址
    
        stu1.number  = 1;
        stu1.english = 1;
        stu1.math    = 1;
    
        stu2.number  = 2;
        stu2.english = 2;
        stu2.math    = 2;
    
        stu3.number  = 3;
        stu3.english = 3;
        stu3.math    = 3;
    
        //插入节点
        list_add_tail(&(stu1.list), &score_head);//在链表尾插入节点,
        list_add_tail(&(stu2.list), &score_head);//参数1节点指针域地址
        list_add_tail(&(stu3.list), &score_head);//参数2头结点指针域地址
    
        //遍历链表
        list_for_each(pos, &score_head)
        //第一个参数是list_head指针,第二个参数是头结点地址,要使用大括号,是for循环
        //随着遍历的进行,pos指针分别指向每一个节点
        {
            //取出节点,注意:返回值是节点指针
            tmp = list_entry(pos, struct score, list);
            //参数1:光标指针,参数2:节点类型,参数3:节点指针域名字
    
            printk("第 %d 号学生\n", tmp->number);
            printk("英语成绩:%d\n", tmp->english);
            printk("数学成绩:%d\n", tmp->math);
            printk("\n");
        }
        return 0;
    }
    
    static void mylist_exit()
    {
        //删除节点,参数为节点的指针域地址
        list_del(&(stu1.list));
        list_del(&(stu2.list));
        list_del(&(stu3.list));
    }
    
    module_init(mylist_list);
    module_exit(mylist_exit);
    

    makefile 文件:

    obj-m := mylist.o
    
    KDIR := /home/ARM_Linux/system2/season4/First/part3/linux-ok6410 
    
    all:
        make -C $(KDIR) M=$(PWD) modules CROSS_COMPILE=arm-linux- ARCH=arm
    
    clean:
        rm -f *.o *.ko *.order *.symvers *.bak *.mod.c
    展开全文
  • Linux内核链表

    2020-11-22 16:44:58
    链表都是第一个接触的内容,笔者也不列外,虽然自己实现过几种链表,但是在实际工作中,还是Linux内核的链表最为常用(同时笔者也建议大家使用内核链表,因为会了这个,其他的都会了),故总结一篇Linux内核链表的...

    大多数人在学习数据结构的时候,链表都是第一个接触的内容,笔者也不列外,虽然自己实现过几种链表,但是在实际工作中,还是Linux内核的链表最为常用(同时笔者也建议大家使用内核链表,因为会了这个,其他的都会了),故总结一篇Linux内核链表的文章。

    文章转载自:https://www.cnblogs.com/yangguang-it/p/11667772.html

    注:Linux内核的链表几乎可以覆盖所有跟链表相关的操作,而且这里面还会涉及到一些kernel编程的小技巧。

    展开全文
  • Linux 内核链表

    2015-12-05 20:30:00
    Linux内核链表  1 . 内核链表函数  1.INIT_LIST_HEAD:创建链表  2.list_add:在链表头插入节点  3.list_add_tail:在链表尾插入节点  4.list_del:删除节点  5.list_entry:取出节点  6.list_for_...

    一 。 Linux内核链表 

       1 . 内核链表函数

         1.INIT_LIST_HEAD:创建链表

         2.list_add:在链表头插入节点

         3.list_add_tail:在链表尾插入节点

         4.list_del:删除节点

         5.list_entry:取出节点

         6.list_for_each:遍历链表

      2.程序代码

        

        

    转载于:https://www.cnblogs.com/lvxiaoning/p/5022218.html

    展开全文
  • linux内核链表实现

    2018-12-28 11:21:26
    linux内核链表的实现,包括内核链表的定义,以及内核链表相关的操作
  • linux内核链表 内核链表的本质 本质就是双向循环链表,linux把前面我们觉得有难度,容易写错的 指针操作封装成函数,直接给我们调用,大大方便我们写代码 内核链表的基本的原理 linux中定义了一个结构体,用来...

    linux内核链表

    1. 内核链表的本质
      本质就是双向循环链表,linux把前面我们觉得有难度,容易写错的
      指针操作封装成函数,直接给我们调用,大大方便我们写代码

    2. 内核链表的基本的原理
      linux中定义了一个结构体,用来存放指针

         struct list_head
            {
     			struct list_head *next, *prev;
            };
    
    1. 内核链表提供的常用接口函数

      (1) 初始化节点中next和prev指针
      INIT_LIST_HEAD(参数) //宏定义
      参数: 表示内核链表中用来存放指针的那个结构体

      (2) 插入数据
      list_add_tail(struct list_head *new, struct list_head *head)
      参数:new --》你要尾插的新节点中的小结构体指针
      head --》链表的表头中的小结构体指针
      功能一: 把new插入到head表示的链表的尾部
      功能二: 把new插入到另外一个节点的前面

      list_add(struct list_head *new, struct list_head *head)
      参数:new --》你要尾插的新节点中的小结构体指针
      head --》链表的表头中的小结构体指针
      功能一:把new插入到头节点和第一个有效节点之间
      功能二:把new插入到另外一个节点的后面

      (3) 删除数据
      void list_del(struct list_head *entry)
      参数:entry --》你要删除的那个节点中的小结构体指针

      (4) 遍历链表
      list_for_each_entry(pos, head, member) //宏函数,本质是for循环
      参数:pos --》用来遍历内核链表的大结构体指针
      head --》链表的表头中的小结构体指针
      member --》小结构体在大结构体中的名字

      (5) 其它函数
      void list_move(struct list_head *list,struct list_head *head)
      void list_move_tail(struct list_head *list,struct list_head *head)

    内核链表的使用:

    #include "myhead.h"
    #include "kernel_list.h"
    
    //定义一个结构体表示内核链表的节点
    typedef struct kerlist
    {
    	//数据域
    	int data;
    	//指针域
    	struct list_head mypoint;
    }klist;
    
    //初始化内核链表的表头
    klist *init_list()
    {
    	klist *head=malloc(sizeof(klist));
    	//初始化指针
    	INIT_LIST_HEAD(&(head->mypoint));
    	return head;
    }
    
    //初始化节点
    klist *create_node(int newdata)
    {
    	klist *newnode=malloc(sizeof(klist));
    	newnode->data=newdata;
    	//初始化指针
    	INIT_LIST_HEAD(&(newnode->mypoint));
    	return newnode;
    }
    
    int main()
    {
    	//初始化头结点
    	klist *myhead=init_list();
    	
    /* 	//尾插几个数据 尾插的功能一
    	klist *new1=create_node(10);
    	list_add_tail(&(new1->mypoint),&(myhead->mypoint));
    	
    	klist *new2=create_node(20);
    	list_add_tail(&(new2->mypoint),&(myhead->mypoint));
    	
    	klist *new3=create_node(30);
    	list_add_tail(&(new3->mypoint),&(myhead->mypoint));
    	
    	//尾插的功能二
    	klist *new4=create_node(40);
    	list_add_tail(&(new4->mypoint),&(new2->mypoint)); //把new4
    	插入到new2的前面
    	 */
    	 
    	klist *new1=create_node(10);
    	list_add(&(new1->mypoint),&(myhead->mypoint));
    	
    	klist *new2=create_node(20);
    	list_add(&(new2->mypoint),&(myhead->mypoint));
    	
    	klist *new3=create_node(30);
    	list_add(&(new3->mypoint),&(myhead->mypoint));
    	
    	//功能二
    	klist *new4=create_node(40);
    	list_add(&(new4->mypoint),&(new2->mypoint)); /*把new4插入
    	到new2的后面*/
    	
    	//删除功能
    	list_del(&(new3->mypoint));
    	 
    	//遍历
    	klist *p;
    	list_for_each_entry(p,&(myhead->mypoint),mypoint)
    	{
    		printf("当前我遍历的链表节点中数据是:%d\n",p->data);
    	}
    	
    }
    
    展开全文
  • linux内核链表.pdf

    2021-08-26 14:51:52
    linux内核链表.pdf
  • 本文讲解Linux内核链表实现的过程,说了链表的定义及初始化宏定义、插入操作和删除操作等内容,详细看下面
  • 博客详细讲解Linux内核链表,教你看懂Linux内核链表与普通链表有什么不一样,并且有测试代码
  • Linux内核链表分析.pdf

    2021-09-06 12:37:30
    Linux内核链表分析.pdf
  • linux内核链表

    2018-12-12 20:48:07
    linux内核链表插入,排序函数库,库里面包含了一些宏。可以进行链表的插入,,删减。与一般链表不同的是,可以连接不同类型的数据。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 66,376
精华内容 26,550
关键字:

linux内核链表

linux 订阅