⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 list.h.txt

📁 linux内核学习笔记 希望想看的人可以很快下载到
💻 TXT
字号:
any question,send email to netxiong@263.net

链表的构造:如果需要构造某类对象的特定列表,则在其结构中定义一个类型为list_head指针的成员,通过这个成员将这类对象连接起来,形成所需列表,并通过通用链表函数对其进行操作。其优点是只需编写通用链表函数,即可构造和操作不同对象的列表,而无需为每类对象的每种列表编写专用函数,实现了代码的重用。

如果想对某种类型创建链表,就把一个list_head类型的变量嵌入到该类型中,用list_head中的成员和相对应的处理函数来对链表进行遍历。如果想得到相应的结构的指针,使用list_entry可以算出来。

(1):list_head:双向链表基本结构,只包含两个指针。

(2):INIT_LIST_HEAD:初始化双向链表——自己指向自己

(3):list_add(struct list_head *new, struct list_head *head)
将new添加到链表中prev和next之间
有两种技巧经常使用
	list_add(new,head->prev)	//将新来的元素加到head的前方,FIFO。 
	list_add(new,head)		//将新来的元素加到head的后面,后来先服务。

(3):static __inline__ void list_del(struct list_head *entry)
把链表节点entry从整个链表中删除。

(4):list_entry(ptr, type, member):
从list_head指针转换到所需结构指针——用成员member的指针(ptr)减去它在结构中的偏移量(0->member),即得到这个结构的指针。其中(unsigned long)(&((type*)0)->member)算出list_head类型变量在整个结构中的偏移量。

(5):LIST_HEAD_INIT(name),LIST_HEAD(name),INIT_LIST_HEAD(name)
三个宏的使用是相同的。没有区别。

(6):#define LIST_HEAD(name)
定义了一个list_head型的变量,初始前后指针都指向自己。调用了LIST_HEAD_INIT(name),所以name不用事先声明

(7):#define list_for_each(pos, head)
 for (pos = (head)->next; pos != (head); pos = pos->next)
pos是一个临时变量,这个宏主要是编历整个列表。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -