四.链表的其他操作
1.结点的替换
1>function:
结点的替换是将old的结点替换成new
2>linux内核提供了两个函数接口:
static inline void list_replace(struct list_head *old,struct list_head *new)
static inline void list_replace_init(struct list_head *old,struct list_head *new)
3> list_replace()函数的实现:
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_repleace()函数只是改变new和old的指针关系,然而old指针并没有释放。
4> list_replace_init()函数的实现:
static inline void list_replace_init(struct list_head *old, struct list_head *new)
{
list_replace(old, new);
INIT_LIST_HEAD(old);
}
List_repleace_init首先调用list_replace改变new和old的指针关系,然后调用INIT_LIST_HEAD(old)将old结点初始化空结点。
2结点的移动
1>function:
将一个结点从一个链表中删除,添加到另一个链表中。
2>linxu内核链表中提供了两个接口
static inline void list_move(struct list_head *list, struct list_head *head)
static inline void list_move_tail(struct list_head *list, struct list_head *head)
前者添加的时候使用的是头插法,后者使用的是尾插法
3> list_move函数实现
static inline void list_move(struct list_head *list, struct list_head *head)
{
__list_del_entry(list);
list_add(list, head);
}
List_move函数调用__list_del_entry()函数将lis结点删除,然后调用list_add()函数将其插入到head结点中(使用头插法)
4>list_move_tail函数实现
static inline void list_move_tail(struct list_head *list, struct list_head *head)
{
__list_del_entry(list);
list_add_tail(list, head);
}
list_move_tail()函数调用_list_del_entry函数将list结点删除,然后调用list_add_tail函数将list结点插入到head结点中(使用尾插法)