【ARM 嵌入式 C 常用数据结构系列 25.1 -- linux 双向链表 list_head 使用详细介绍】

请阅读【嵌入式开发学习必备专栏 】


文章目录

内核双向链表

在Linux内核中,双向链表是一种广泛使用的数据结构,允许从任意节点高效地进行前向或后向遍历。Linux内核提供了一套丰富的宏和函数来操作双向链表,这些链表定义在list.h头文件中。

双向链表的数据结构

双向链表的基本结构由list_head结构体表示,该结构体包含两个指针,分别指向链表的前一个和后一个元素:

c 复制代码
struct list_head {
    struct list_head *next, *prev;
};

初始化双向链表

双向链表可以通过两种方式进行初始化:

  • 静态初始化使用LIST_HEAD宏:

    c 复制代码
    LIST_HEAD(my_list);
  • 动态初始化使用INIT_LIST_HEAD宏:

    c 复制代码
    struct list_head my_list;
    INIT_LIST_HEAD(&my_list);

在双向链表中添加元素

  • 使用list_add在链表的头部添加新元素:

    c 复制代码
    list_add(&new_element->list, &head);
  • 使用list_add_tail在链表的尾部添加新元素:

    c 复制代码
    list_add_tail(&new_element->list, &head);

遍历双向链表

  • 使用list_for_each宏遍历链表:

    c 复制代码
    struct list_head *pos;
    list_for_each(pos, &my_list) {
        // 使用pos
    }
  • 使用list_for_each_entry宏遍历链表,直接获取包含list_head的结构体实例:

    c 复制代码
    struct my_struct *entry;
    list_for_each_entry(entry, &my_list, list) {
        // 使用entry
    }

链表使用示例

以下示例展示了如何定义一个包含list_head的结构体,以及如何初始化链表、添加元素和遍历链表。

首先,定义一个结构体person,包含姓名、年龄和一个list_head

c 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "list.h"

struct person {
    char name[20];
    int age;
    struct list_head list;
};

int list_test(void) 
{
    struct person john;
    strcpy(john.name, "John Doe");
    john.age = 30;
    
    struct person jane;
    strcpy(jane.name, "Jane Doe");
    jane.age = 25;
    
    // 初始化链表头
    LIST_HEAD(people_list);
    
    // 添加元素到链表
    list_add_tail(&john.list, &people_list);
    list_add_tail(&jane.list, &people_list);
   
    // 遍历链表
    struct person *entry;
    list_for_each_entry(entry, &people_list, list) {
        printf("Name: %s, Age: %d\n", entry->name, entry->age);
    }
   
    return 0;
}

这个例子创建了一个包含两个人johnjane的双向链表,并遍历链表打印每个人的姓名和年龄。

注意事项

  • 在使用双向链表时,需要包含Linux内核的list.h头文件,这个文件通常只在内核模块开发中直接可用。对于用户空间程序,可以考虑实现自己的双向链表,或使用其他库提供的类似功能。
  • 上述示例简化了错误检查和内存管理的细节。在实际应用中,添加到链表中的元素通常是动态分配的,需要妥善管理内存以避免内存泄漏。
相关推荐
Fanxt_Ja13 小时前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
今后12314 小时前
【数据结构】二叉树的概念
数据结构·二叉树
小莞尔15 小时前
【51单片机】【protues仿真】基于51单片机的篮球计时计分器系统
c语言·stm32·单片机·嵌入式硬件·51单片机
小莞尔15 小时前
【51单片机】【protues仿真】 基于51单片机八路抢答器系统
c语言·开发语言·单片机·嵌入式硬件·51单片机
liujing1023292915 小时前
Day03_刷题niuke20250915
c语言
第七序章18 小时前
【C++STL】list的详细用法和底层实现
c语言·c++·自然语言处理·list
l1t20 小时前
利用DeepSeek实现服务器客户端模式的DuckDB原型
服务器·c语言·数据库·人工智能·postgresql·协议·duckdb
l1t1 天前
利用美团龙猫用libxml2编写XML转CSV文件C程序
xml·c语言·libxml2·解析器
一起搞IT吧1 天前
嵌入式ARM SOC开发中文专题分享一:ARM SOC外围资源介绍
arm开发·嵌入式硬件
研华嵌入式1 天前
如何在高通跃龙QCS6490 Arm架构上使用Windows 11 IoT企业版?
arm开发·windows·嵌入式硬件