Linux内核中双向链表的经典实现
|
(04). 删除节点
static inline void __list_del(struct list_head * prev, struct list_head * next)
{
next->prev = prev;
prev->next = next;
}
static inline void list_del(struct list_head *entry)
{
__list_del(entry->prev, entry->next);
}
static inline void __list_del_entry(struct list_head *entry)
{
__list_del(entry->prev, entry->next);
}
static inline void list_del_init(struct list_head *entry)
{
__list_del_entry(entry);
INIT_LIST_HEAD(entry);
}
__list_del(prev, next) 和__list_del_entry(entry)都是linux内核的内部接口。 __list_del(prev, next) 的作用是从双链表中删除prev和next之间的节点。 __list_del_entry(entry) 的作用是从双链表中删除entry节点。 list_del(entry) 和 list_del_init(entry)是linux内核的对外接口。 list_del(entry) 的作用是从双链表中删除entry节点。 list_del_init(entry) 的作用是从双链表中删除entry节点,并将entry节点的前继节点和后继节点都指向entry本身。 (05). 替换节点
static inline void list_replace(struct list_head *old,
struct list_head *new)
{
new->next = old->next;
new->next->prev = new;
new->prev = old->prev;
new->prev->next = new;
}
list_replace(old, new)的作用是用new节点替换old节点。 (06). 判断双链表是否为空
static inline int list_empty(const struct list_head *head)
{
return head->next == head;
}
list_empty(head)的作用是判断双链表是否为空。它是通过区分"表头的后继节点"是不是"表头本身"来进行判断的。 (07). 获取节点
#define list_entry(ptr, type, member)
container_of(ptr, type, member)
list_entry(ptr, type, member) 实际上是调用的container_of宏。 它的作用是:根据"结构体(type)变量"中的"域成员变量(member)的指针(ptr)"来获取指向整个结构体变量的指针。 (编辑:佛山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

