摘要:linux核心源碼真是好東東,是衆多高手思維的結晶,在linux 源代碼中有個頭檔案為list.h 。很多linux 下的源代碼都會使用這個頭檔案,它裡面定義了一個結構, 以及定義了和其相關的一組函數,這個結構是這樣的:
struct
list_head{
list_head *next, *prev;
};
如果您之前學過雙向連結清單,那麼當你看到這個結構的時候,會覺得似曾相識。豈止似曾相識,如果你看過Fio的源碼,你會覺得它用的如此廣泛,下面我們通過一個執行個體示範如何使用
一、編寫代碼
[root@bdkyr cstudy]# cat double_list.c
#include
#include "list.h"
struct int_node
{
/*視情況,增加*/
int val;
int num;
/************/
struct list_head list;
int main()
struct list_head head,*plist;
struct int_node a,b,c;
a.val = 1;
a.num = 1;
b.val = 2;
b.num = 2;
c.val = 3;
c.num = 3;
INIT_LIST_HEAD(&head); //初始化連結清單頭
list_add_tail(&a.list,&head); //添加節點
list_add_tail(&b.list,&head);
list_add_tail(&c.list,&head);
printf("************周遊連結清單,列印結果**************\n");
list_for_each(plist,&head) //周遊連結清單,列印結果
{
struct int_node *node = list_entry(plist,struct int_node,list); //然後取得資料項,是以一般來說和list_for_each配合使用
printf("val = %d, num = %d\n", node->val, node->num);
}//print 1 1 2 2 3 3
printf("************删除節點b,重新周遊連結清單,列印結果*\n");
list_del(&b.list); //删除節點b
list_for_each(plist,&head) //重新周遊連結清單,列印結果
struct int_node *node = list_entry(plist,struct int_node,list);
}//print 1 1 3 3
printf("************列印連結清單head1******************\n");
struct int_node d,e;
struct list_head head1;
d.val = 4;
d.num = 4;
e.val = 5;
e.num = 5;
INIT_LIST_HEAD(&head1); //重建立立連結清單,表頭為head1
list_add_tail(&d.list,&head1);
list_add_tail(&e.list,&head1);
list_for_each(plist,&head1)
}
printf("*******************************************\n");
if(!list_empty(&head)) //判斷連結清單是否為空
printf("the list is not empty!\n");
return 0;
}