资源介绍
一、linux内核链表
1、普通链表的数据区域的局限性
之前定义数据区域时直接int data,我们认为我们的链表中需要存储的是一个int类型的数。但是实际上现实编程中链接中的节点不可能这么简单,而是多种多样的。
一般实际项目中的链表,节点中存储的数据其实是一个结构体,这个结构体中包含若干的成员,这些成员加起来构成了我们的节点数据区域。
2、一般性解决思路:即把数据区封装为一个结构体
(1)因为链表实际解决的问题是多种多样的,所以内部数据区域的结构体构成也是多种多样的。
这样也导致了不同程序当中的链表总体构成是多种多样的。
我们无法通过一套泛性的、普遍适用的操作函数来访问所有的链表,意味着我们设计一个链表就得写一套链表的操作函数(节点创建、插入、删除、遍历……)。
(2)实际上深层次分析会发现
不同的链表虽然这些方法不能通用需要单独写,但是实际上内部的思路和方法是相同的,只是函数的局部地区有不同。
实际上链表操作是相同的,而涉及到数据区域的操作就有不同
(3)问题
能不能有一种办法把所有链表中操作方法里共同的部分提取出来用一套标准方法实现,然后把不同的部分留着让具体链表的实现者自己去处理。
3、内核链表的设计思路
(1)内核链表中实现一个纯链表的封装,以及纯链表的各种操作函数
纯链表就是没有数据区域,只有前后向指针;
各种操作函数是节点创建、插入、删除、遍历。
这个纯链表本身自己没有任何用处,它的用法是给我们具体链表作为核心来调用。
4、list.h文件简介
(1)内核中核心纯链表的实现在include/linux/list.h文件中
(2)list.h中就是一个纯链表的完整封装,包含节点定义和各种链表操作方法。
二、内核链表的基本算法和使用简介
1、内核链表的节点创建、删除、遍历等
2、内核链表的使用实践
(1)问题:内核链表只有纯链表,没有数据区域,怎么使用?
使用方法是将内核链表作为将来整个数据结构的结构体的一个成员内嵌进去。类似于公司收购,实现被收购公司的功能。
这里面要借助container_of宏。