首页 > 代码库 > Linux内核之旅 链表实现

Linux内核之旅 链表实现

 1 #include "stdio.h"
 2 #include "stdlib.h"
 3 
 4 struct list_head{
 5     struct list_head *prev;
 6     struct list_head *next;
 7 };
 8 
 9 struct task{
10     int member;
11     struct list_head list;
12 };
13 
14 #define list_entry(ptr,member,type) 15 ((type*)((char *)ptr-(unsigned long)&(((type*)0)->member)))
16 
17 #define Init_list(list) {&list,&list}
18 
19  static  void list_add(struct list_head* ptr,struct list_head* n){
20     ptr->next=n->next;
21     n->next->prev=ptr;
22     n->next=ptr;
23     ptr->prev=n;
24 }
25 
26 #define for_each(list_)27 for(pos=list_.next;pos!=&list_;pos=pos->next)28 {printf("%d ",list_entry(pos,list,struct task)->member);}29 printf("\n");
30 
31 
32 void main(){
33     struct task* tmp;
34     int i;
35     struct list_head mylist=Init_list(mylist),*pos;
36 
37     for( i=0;i<5;i++){
38         tmp=(struct task*)malloc(sizeof(struct task));
39         scanf("%d",&(tmp->member));
40         list_add(&(tmp->list),&mylist);
41     }
42     
43     for_each(mylist);
44 
45 }