📄 list.h.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 + -