Linux中链表(list.h)的实现原理

这篇博客介绍了Linux内核中链表的实现原理,不同于常规的链表实现,Linux使用data_list和data_node两个结构体,通过data_list保存链表节点信息,并在data_node中包含data_list。文章详细阐述了list_entry和container_of宏的工作机制,以及这种实现方式的优缺点。
摘要由CSDN通过智能技术生成

原文地址:http://wuzufei.cn/linux_list.html

1 概述

通常情况下,我们使用C语言实现定义的链表节点形式如下:

struct Node { 
    int data; 
    struct Node* next; 
}; 

常规使用一个结构体定义节点,然后在每个节点中保存前驱/后继节点的首地址,通过遍历每个节点中的next成员访问下一个节点;

而在linux 的内核实现中,链表节点定义方式如下:

struct list_head {
    struct list_head *next, *prev;
}
struct data_node {
    int val;
    struct list_head  data_list;
}

linux 使用两个结构体,data_list保存链表节点信息,data_node则是用于保存数据,然后在data_node中包含data_list;不同data_node通过data_list节点的next和prev指针关联,遍历数据的过程时遍历链表节点,然后判断每个链表节点所在数据结构体的字段信息,进行相应的CRUD。

常规实现直接将各个数据结构体串联起来,即数据节点本身就是链表的一个node;<

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值