Linux 中 struct list_head 用法

头文件

#include <linux/list.h>

struct list_head简化定义

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

声明和初始化链表头

方法一

#include <linux/list.h>  
  
LIST_HEAD(my_list); // 声明并初始化链表头  

方法二

struct list_head my_list;  //声明链表头
INIT_LIST_HEAD(&my_list); // 初始化链表头(对于静态或全局变量)    

list_head放入到结构体中

struct man_info {  
    int id;  
    char *name;  
    struct list_head list; //我们的list 成员
};

添加节点到链表 list_add_tail

struct man_info *node = kmalloc(sizeof(struct man_info), GFP_KERNEL);  
INIT_LIST_HEAD(&node->list); //对于再结构中的list_head 为非必须
node->id = 123;  
node->name = "SDJMCGSJZY";  
 
  
// 添加到链表末尾  
list_add_tail(&node->list, &my_list)

遍历链表

struct list_head *pos;  
list_for_each(pos, &man_info) {  
    // 这里不能直接访问man_info结构体的成员  
    // 需要使用list_entry宏来获取包含list_head的结构体指针  
    struct man_info *n = list_entry(pos, struct man_info, list);  
    printk(KERN_INFO "ID: %d, Name: %s\n", n->id, n->name);  
}  
  
// 或者使用更安全的遍历方式,防止在遍历过程中删除节点导致的错误  
struct list_head *pos, *tmp;  
list_for_each_safe(pos, tmp, &my_list) {  
    struct my_data *n = list_entry(pos, struct my_data, list);  
    // ...  
}

删除节点

list_del

list_del 将节点从链表中移除,但不初始化节点的 next 和 prev 指针;

list_del_init

list_del_init 将节点从链表中移除并且还会将节点的 next 和 prev 指针初始化为指向自己,这样节点就可以被安全地重新添加到链表中,而无需再次调用 INIT_LIST_HEAD。
//删除节点方法一
list_del(&node->list); // 从链表中删除节点  

//删除节点方法二
list_del_init(&node->list); // 从链表中删除节点并初始化其list_head
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值