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

C 链表 - linux 如何实现

想起前段时间, 看到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 是如何管理链表的。...,进而对具体数据进行处理, 利用c语言的一个小技巧, 把结构体投影到地址为0的地方,那么成员的绝对地址就是偏移量, 得到偏移量后,根据成员的p指针反算出结构体的首地址。

2.7K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux C 数据结构 ->单向链表

    简介   链表Linux 内核中最简单,最普通的数据结构。...链表是一种存放和操作可变数量元素(常称为节点)   的数据结构,链表和静态数组的不同之处在于,它所包含的元素都是动态创建并插入链表的,在编译   时不必知道具体需要创建多少个元素,另外也因为链表中每个元素的创建时间各不相同...根据它的特性,链表可分为:单链表,双链表,单向循环链表和双向循环链表,今天总结记录的就是   最简单的单链表,   1.1 节点类型描述   1 typedef struct node_t {   ...链表基本运算的相关"算法"操作 or 操刀(~烹羊宰牛且为乐,会须一饮三百杯~)   链表的运算除了上面的创建空链表,还有数据的插入,删除,查找等函数,链表的运算有各种实现方   法,如何写出一个高效的...list);   47   48   49 #endif // _LIST_LINK_H_   listlink.c   1 #include   2 #include   3 #include

    1.1K00

    循环队列出-单个指针下循环链表的入队与出

    循环链表的入队出   题目是这样的: 设以不带头结点的循环链表表示队列,并且只设一个指针指向尾结点,但不设头指针。编写相应的入队和出程序。   ...思考方向   队列嘛,先进先出,用循环链表存储,再有个尾指针,逻辑结构就是这样的   入队   入队分三步:   新结点指向头结点   尾结点指向新节点   尾指针指向新的尾结点   出   先进先出嘛...,头结点删了就行   理论上直接尾结点指向第二个就完事了   但这样只是找不到了原来的头结点,它依然是存在于内存中的,虽说眼不见为净吧   ,但它确确实实是存在的循环队列出循环队列出,一旦堆积,这队列容量就会越来越小

    30320

    Linux C语言链表你学会了吗?

    链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节点。链表都有一个头指针,一般以head来表示,存放的是一个地址。...链表中的节点分为两类,头结点和一般节点,头结点是没有数据域的。链表中每个节点都分为两部分,一个数据域,一个是指针域。...作为有强大功能的链表,对他的操作当然有许多,比如:链表的创建,修改,删除,插入,输出,排序,反序,清空链表的元素,求链表的长度等等。   ...初学链表,一般从单向链表开始 --->NULL   head   这是一个空链表。   ---->[p1]---->[p2]......初始化一个链表,n为链表节点个数。

    1.3K20

    c++的链表-C++链表

    C++链表   链表是由一系列连接在一起的结点构成,其中的每个结点都是一个数据结构。   ...链表是一种复杂的数据结构,其数据之间相互关系使得链表分成三种:单链表、循环链表、双向链表。   ...从链表头开始,可以按照存储在每个结点中的后继指针访问链表中的其余结点。最后一个结点中的后继指针被设置为 以指示链表的结束。   指向链表头的指针用于定位链表的头部,所以也可以认为它代表了链表头。...由 3 个结点组成的链表,其中显示了指向头部的指针,链表的 3 个结点以及表示链表末尾的 指针。   链表结构图解   一、单向链表   单链表有一个头结点head,指向链表在内存的首地址。...链表的尾结点由于无后续结点c++的链表,其指针域为空,写作NULL。

    96520

    c++的链表-链表入门(C++)

    从上的链表基础知识学习,进行总结如下:   1.单链表介绍   单链表与数组不同,数组中只存储元素的值,而单链表中除了数据的值外还包括了指向下一个节点的引用字段通常以next来表示。...如下图表示,通过这个引用,单链表将所有节点按照顺序组织起来。   通常单链表如下定义:    // Definition for singly-linked list....2.链表添加   链表添加又分为在中间添加、在头部添加以及在尾部添加,首先是头部添加:   头结点是整个链表的代表因此在头部进行添加节点时最重要的是添加后更新head:   初始化一个cur;将该结点连接到...这样与数组进行对比我们只需要O(1)的时间复杂度就可以将元素插入进链表。   ...因为cur节点的下一个节点就是cur->nextc++的链表,但是上一个节点需要遍历才可以找到c++的链表,因此删除节点的时间复杂度为O(N)。

    84720

    C语言链表应用--基于Linux C多线程软件框架实现

    之前写过一篇基于C语言链表实现的工作任务注册与执行,链接如下: https://blog.csdn.net/morixinguan/article/details/77986553 后面使用它演变成为了另外一个框架...搞过RK(瑞芯微)平台的都知道,这个平台提供了一个PCBA的测试程序,它是基于Linux内核链表框架实现的,但该程序有一点不好的地方就在于框架用起来不是那么的简单,因此我针对该项目做了自己的优化,使之用起来简单...s32 Run_Priority_work(_work handler,s32 direction,const s32 work_array_size) ; #endif //__WORK_H work.c...1、初始化工作 2、工作任务注册 3、调度任务运行 测试使用:test.c #include #include "work.h" int Test1(int work_num) ; int

    2.4K50

    c++的链表-C++实现简单链表

    链表是最常用的一种数据结构,无论什么语言,学习数据结构,都绕不开链表,下面通过c++来实现简单链表,所谓简单链表,就是构建链表,然后遍历打印链表。   ...c++中构建链表,最简单的是使用结构体来定义节点,节点定义很简单:节点数据,下一个节点c++的链表,这就是链表的全部,另外,为了通过new的时候,直接创建一个节点,我们可以通过定义一个带参数的构造函数来实现...链表结构体定义如下:   这里,我们通过循环来构建一个简单的链表链表节点数据就是一个数组[0,1,2,3,4]的各个元素:   如下图所示,这种简单的构建方式,构建链表的过程是一种特殊的构建方式c++...的链表,和我们平时理解的不太一样。   ...我们可以 按照常规的办法来构建链表,同样是循环插入数据,不过这时候需要新增一个指针,来记录当前节点,我们不能再使用头结点来做插入。

    84010

    C语言链表实例--玩转链表

    下图为最一简单链表的示意图: 第 0 个结点称为头结点,它存放有第一个结点的首地址,它没有数据,只是一个指针变量。...这样一种连接方式,在数据结构中称为“链表”。 而使用动态分配时,每个结点之间可以是不连续的(结点内是连续的)。...链表的基本操作对链表的主要操作有以下几种: 1. 建立链表; 2. 结构的查找与输出; 3. 插入一个结点; 4. 删除一个结点; 建立一个三个结点的链表,存放学生数据。...可编写一个建立链表的函数 creat。...下方为创客专门针对C语言链表分析的视频资料,对链表感兴趣的可以看看学习下 1 C语言玩转链表 http://www.makeru.com.cn/live/1392_338.html?

    2K31

    C语言链表实例--玩转链表

    下图为最一简单链表的示意图:   第 0 个结点称为头结点,它存放有第一个结点的首地址,它没有数据,只是一个指针变量。...链表中的每一个结点都是同一种结构类型。   指针域: 即在结点结构中定义一个成员项用来存放下一结点的首地址,这个用于存放地址的成员,常把它称为指针域。   ...这样一种连接方式,在数据结构中称为“链表”。   而使用动态分配时,每个结点之间可以是不连续的(结点内是连续的)。...链表的基本操作对链表的主要操作有以下几种:   1. 建立链表;   2. 结构的查找与输出;   3. 插入一个结点;   4. 删除一个结点;   建立一个三个结点的链表,存放学生数据。...可编写一个建立链表的函数 creat。

    1.6K20

    linux通用链表

    Linux中设计了一种适合于各种类型数据域都可以使用的通用型链表: struct list_head { struct list_head *prev, *next; }; 摒弃掉数据域,只保留头尾指针...Linux中在声明中抛弃了数据域,也就解决掉了这一问题。 原理 Linux使用链表的方法:使用时,自定义结构体包含数据域+链表结构体。...链表.png 如上图所示,将结构体A、B、C中的内核结构体指针构建成双链表,这样结构体A、B、C中的链表成员就可以互相索引了。...(NODE)); init_list_head(&head->my_list); return head; } 「内部数据域访问:」 在实现以上操作,就可以实现结构体A、B、C链表成员的索引遍历了...既然能访问到结构体A、B、C内部成员,自然也可以通过地址换算得到结构体A、B、C的首地址;进而得到A、B、C的数据域成员。

    1.1K20
    领券