首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux通用链表

引言 链表实现是基于结构体与指针两者实现,常用链表数据结构如下: //将int起别名ELEMTYPE,是为了方便修改链表数据域类型。...在Linux中设计了一种适合于各种类型数据域都可以使用通用链表: struct list_head { struct list_head *prev, *next; }; 摒弃掉数据域,只保留头尾指针...内核链表 链表主要意义就是将分散地址数据域通过指针排列成有序队列。因此数据域是链表不可或缺一部分,但是在实际使用中需要不同类型数据域,因此也就限制了链表通用。...Linux中在声明中抛弃了数据域,也就解决掉了这一问题。 原理 Linux使用链表方法:使用时,自定义结构体包含数据域+链表结构体。...,就可以实现结构体A、B、C中链表成员索引遍历了。

1K20

Linux 内核通用链表学习小结

描述 在linux内核中封装了一个通用双向链表库,这个通用链表库有很好扩展性和封装性,它给我们提供了一个固定指针域结构体,我们在使用时候,只需要在我们定义数据域结构体中包含这个指针域结构体就可以了...,具体实现、链接并不需要我们关心,只要调用提供给我们相关接口就可以完成了。...传统链表结构 struct node{ int key; int val; node* prev; node* next; } linux 内核通用链表库结构 提供给我们指针域结构体...list就是student结构定义里属性list //list_entry原理有点复杂,也是linux内核一个经典实现,这个在上面那篇链接文章里也有讲解 tmp_student...内核提供这个通用链表库里面还有很多其他接口,这里没有详细一一举例,有兴趣可以自己去看看,在源码包 include/linux/list.h 文件里面,不过通过阅读一些源代码确实对我们也有很大提高

1.2K21
您找到你想要的搜索结果了吗?
是的
没有找到

如何移植并使用Linux内核通用链表(附完整代码实现

在实际工作中,我们可能会经常使用链表结构来存储数据,特别是嵌入式开发,经常会使用linux内核最经典双向链表 list_head。...本篇文章详细介绍了Linux内核通用链表是如何实现,对于经常使用函数都给出了详细说明和测试用例,并且移植了Linux内核链表结构,在任意平台都可以方便调用内核已经写好函数。...Linux内核中链表   上面介绍了普通链表实现方式,可以看到数据域都是包裹在节点指针中,通过节点指针访问下一组数据。...但是 Linux内核链表实现可以说比较特殊,只有前驱和后继指针,而没有数据域。链表头文件是在include/list.h(Linux2.6内核)下。...在实际工作中,也可以将内核中链表拷贝出来供我们使用,就需不要造轮子了。 链表定义   内核链表只有前驱和后继指针,并不包含数据域,这个链表具备通用性,使用非常方便。

1.3K20

C 链表 - linux 如何实现

链表是基本数据结构, 一开始学习数据结构时, 我一般这么定义, 对应实现从头或尾插入处理函数, struct int_node_old { int val; struct int_node_old...想起前段时间, 看到FreeRTOS提供链表处理方式(《 FreeRTOS 任务调度 List 组织 》), 将链表结构定义和实际使用时具体节点数据内容分开定义, 供系统各个模块使用。...查看linux源码, 发现linux中也为我们提供了相似的实现(源码), 把一些共性统一起来。 类是 python 中for_each处理,有些意思。...linux链表定义在文件 include/linux/types.h, 采用是双向列表 struct list_head { struct list_head *next, *prev;...list 利用这个定义, 我定义了一个自己list数据结构, 并copy了一些接口实现,感受下,linux 是如何管理链表

2.7K30

Linux内核中双向链表经典实现

概要 本文对双向链表进行探讨,介绍内容是Linux内核中双向链表经典实现和用法。其中,也会涉及到Linux内核中非常常用两个经典宏定义offsetof和container_of。...内容包括: 1.Linux两个经典宏定义 2.Linux中双向链表经典实现 Linux两个经典宏定义 倘若你查看过Linux Kernel源码,那么你对 offsetof 和 container_of...Linux中双向链表经典实现 1.Linux中双向链表介绍 Linux双向链表定义主要涉及到两个文件: include/linux/types.h include/linux/list.h Linux...list_del(entry) 和 list_del_init(entry)是linux内核对外接口。 list_del(entry) 作用是从双链表中删除entry节点。...3.Linux中双向链表使用示例 双向链表代码(list.h): 1 #ifndef _LIST_HEAD_H 2 #define _LIST_HEAD_H 3 // 双向链表节点 4 struct

2.6K30

002 Linux内核中双向链表经典实现

概要 本文对双向链表进行探讨,介绍内容是Linux内核中双向链表经典实现和用法。其中,也会涉及到Linux内核中非常常用两个经典宏定义offsetof和container_of。...内容包括: 1.Linux两个经典宏定义 2.Linux中双向链表经典实现 Linux两个经典宏定义 倘若你查看过Linux Kernel源码,那么你对 offsetof 和 container_of...Linux中双向链表经典实现 1.Linux中双向链表介绍 Linux双向链表定义主要涉及到两个文件: include/linux/types.h include/linux/list.h Linux...list_del(entry) 和 list_del_init(entry)是linux内核对外接口。 list_del(entry) 作用是从双链表中删除entry节点。...3.Linux中双向链表使用示例 双向链表代码(list.h): 1 #ifndef _LIST_HEAD_H 2 #define _LIST_HEAD_H 3 // 双向链表节点 4 struct

1.7K20

链表和双向链表实现

前言 ---- 链表数据通过指针连接,添加、插入或删除节点只需要修改指针指向 实现思路 实现一个链表需要具备以下方法 在链表尾部添加节点 获取链表所有节点数据 链表指定位置插入元素 获取链表指定位置节点数据...获取节点在链表位置 更新链表指定位置数据 移除链表指定位置节点 移除链表指定节点 判断链表是否为空 获取链表长度 链表内部需要定义head指针和链表长度 实现代码 定义head指针和length...(linkedList.size()) 双向链表 双向链表指针是双向,前指针指向上一个节点,后指针指向下一个节点 head指向第一个节点,tail指向最后一个节点 双向链表实现思路 需要具备以下方法...尾部插入元素 任意位置插入元素 获取所有节点数据 正向遍历链表获取节点数据 反向遍历链表获取节点数据 获取指定位置节点数据 获取指定数据在链表位置 更新指定位置节点数据 移除指定位置节点 移除指定数据节点...判断链表是否为空 获取链表长度 定义head和tail分别指向第一个节点和最后一个节点 代码实现 /** * 双向链表 */ function DoublyLinkedList() { //指向第一个节点

67340

链表实现

链表之前我们已经介绍过,这章笔记我们就来通过C++语言实现一个简单链表 C语言表示链表一个节点 struct Node { int data; struct Node*link; } 上图: 头节点...首先链表有一个头节点,他没有数据,类型是节点指针 他负责标识这个链表,比如我现在这个头节点叫head ,如果head = NULL表示链表为空 如果head不为空则表示链表有节点。...通过malloc给节点在堆上分配内存 Node*temp = malloc(sizeof(Node)); 然后通过头节点指向这个节点 head = temp; 这样我们就创建了一个有节点链表 我们想在已有的节点后面再创建一个节点该如何创建呢...=NULL) { temp = temp->link; } printf("the last data of Node is %d",temp->data); 很简单逻辑 头节点是不可以被修改,因为头结点是链表标识...,如果修改掉链表标识,链表将无法成立

11510

链表实现

链表分为单向链表、双向链表和循环链表链表这种数据结构就像是火车车厢一样,每个车厢可以插入到任意位置。...isEmpty(): 如果链表中不包含任何元素,返回 true,如果链表长度大于 0 则返回 false。 下面来一一进行实现。...先实现单向链表(上一个数据指针指向下一个数据存储地址),然后在这基础上实现双向链表和循环链表。这里使用 ES6 class 形式来实现。...remove 方法可以结合 indexOf 方法和 removeAt 方法来实现。先通过 indexOf方法获取要删除元素索引,然后通过索引去删除指定元素。...false : this.removeAt(idx); } insert(index,elem) 方法 这个方法跟删除一个元素实现思路很相似,也需要条件判断,也需要断开链表然后插入新内容。

51210

Linux内核链表使用

/******************** * 内核中链表应用 ********************/ (1)介绍 在Linux内核中使用了大量链表结构来组织数据,包括设备列表以及各种功能模块中数据组织...这些链表大多采用在include/linux/list.h实现一个相当精彩链表数据结构。...和以前介绍链表结构模型不同,这里list_head没有数据域。在Linux内核链表中,不是在链表结构中包含数据,而是在数据结构中包含链表节点。...如: struct my_struct{ struct list_head list; unsigned long dog; void *cat; }; linux链表没有固定表头,从任何元素开始访问都可以...定义在 a.增加节点 list_add(struct list_head *new, struct list_head *head); 向指定链表head

2.2K30

循环链表实现_建立双向循环链表

循环链表   循环链表是一个收尾相接链表,将单链表最后一个指针域改由NULL改为指向表头结点这就是单链式循环链表,并称为循环单链表   带头结点循环单链表各种操作算法实现与带头结点单链表算法实现类似...单链表判别条件为p!=NULL或p->next!=NULL,而单循环链表判别条件是p!=L或p->next!=L   在循环单链表中附设尾指针有时候比附设头指针更简单。...如:在用头指针循环单链表中找a1时间复杂度是O(1),找an需要从头找到尾,时间复杂度是O(n),如果用为指针rear,找开始结点和终端结点存储位置分别是rear->next->next和rear...    方法一:先找到两个链表LA,LB表尾,分别用p,q指向它,然后将第一个链表表尾与第二个链表第一个结点连起来,修改第二个表尾q,使它链域指向第一个表头 //头指针合并循环链表 #include...;//返回新链表尾指针 }   循环链表求长度 #include #define len sizeof(Node) #include typedef struct

71620

DS:单链表实现

在博主上一篇文章中,很详细地介绍了顺序表实现过程以及如何去书写代码,如果没看过友友们建议先去看看哦! DS:顺序表实现(超详细!!)...答案就是——链表!! 二、链表概念及结构 概念:链表是⼀种物理存储结构上非连续、非顺序存储结构,数据元素逻辑顺序是通过链表指针链接次序实现 。...四、单链表实现 有了链表结点结构体,我们就可以去实现链表(single linked list)了。...2、链表通用性 与顺序表一样,由于我们对存储数据类型进行了重命名,所以我们可以直接修改就能让该链表不仅可以实现int类型存储,还可以是char、double、float甚至是一些自定义结构体类型...,函数接口也是基本上可以无缝衔接,但是呢,跟顺序表一样,查找函数和打印函数是不通用,需要需要根据具体数据类型去修改。

8810

【C语言】链表使用及链表实现原理

链表是什么? 1.逻辑结构上⼀个挨⼀个数据,在实际存储时,并没有像顺序表那样也相互紧挨着。恰恰相 反,数据随机分布在内存中各个位置,这种存储结构称为线性表链式存储。...2.由于分散存储,为了能够体现出数据元素之间逻辑关系,每个数据元素在存储同时,要 配备⼀个指针,⽤于指向它直接后继元素,即每⼀个数据元素都指向下⼀个数据元素 ** 本身信息,称为“数据域”...下面是一个单链表实现过程 #include #include #include //结构体是⼀种⼯具,⽤这个⼯具可以定义⾃⼰数据类型 typedef struct...Student Stu; struct tagNode *pNext; } Node; //定义链表第...⼀个学⽣,即学⽣单链表头结点 Node *head = NULL; void printfNode() //遍历元素

95110
领券