以上函数的功能为删除entry所指向的结点,同时调用LIST_INIT_HEAD()把被删除结点为作为链表头构建一个新的空双循环链表。
- #include <stdio.h>
- #include <stdlib.h>
- #include "list.h"
-
- typedef struct _stu
- {
- char name[20];
- int num;
- struct list_head list;
- }stu;
-
- int main()
- {
- stu *pstu;
- stu *tmp_stu;
- struct list_head stu_list;
- struct list_head *pos;
- int i = 0;
-
- INIT_LIST_HEAD(&stu_list);
-
- pstu = malloc(sizeof(stu)*5);
-
- for(i=0;i<5;i++)
- {
- sprintf(pstu[i].name,"Stu%d",i+1);
- pstu[i].num = i+1;
- list_add( &(pstu[i].list), &stu_list);
- }
-
- list_del(&(pstu[3].list));
- printf("使用list_del()删除pstu[3]\n");
- list_for_each(pos,&stu_list)
- {
- tmp_stu = list_entry(pos, stu, list);
- printf("student num: %d\tstudent name: %s\n",tmp_stu->num,tmp_stu->name);
- }
- list_del_init(&(pstu[2].list));
- printf("使用list_del_init()删除pstu[2]\n");
- list_for_each(pos,&stu_list)
- {
- tmp_stu = list_entry(pos, stu, list);
- printf("student num: %d\tstudent name: %s\n",tmp_stu->num,tmp_stu->name);
- }
- free(pstu);
- return 0;
- }
|
运行结果为:
- root@ubuntu:/home/paixu/dlist_node# ./a
- 使用list_del()删除pstu[3]
- student num: 5 student name: Stu5
- student num: 3 student name: Stu3
- student num: 2 student name: Stu2
- student num: 1 student name: Stu1
- 使用list_del_init()删除pstu[2]
- student num: 5 student name: Stu5
- student num: 2 student name: Stu2
- student num: 1 student name: Stu1
|
看了代码的使用之后我们再去理解之前的讲解就要轻松多了。读者可以结合上面相应的文字描述再分析下代码,以加深印象。接着往下看,坚持看完本篇博客的最后两个函数。
- static inline void list_move(struct list_head *list, struct list_head *head)
- {
- __list_del(list->prev, list->next);
- list_add(list, head);
- }
-
- static inline void list_move_tail(struct list_head *list,
- struct list_head *head)
- {
- __list_del(list->prev, list->next);
- list_add_tail(list, head);
- }
|