1 #ifndef _LIST_H
2 #define _LIST_H
3 #include"stdio.h"
4 #define _INLINE_ static inline
5
6 struct list_head {
7 struct list_head *next, *prev;
8 };
9
10 #define LIST_HEAD_INIT(name) {&(name), &(name)}
11
12 #define LIST_HEAD(name)
13 struct list_head name = LIST_HEAD_INIT(name)
14
15 #define INIT_LIST_HEAD(ptr) do {
16 (ptr)->next = (ptr); (ptr)->prev = (ptr);
17 } while (0)
18
19 _INLINE_ void __list_add(struct list_head *add,
20 struct list_head *prev,
21 struct list_head *next)
22 {
23 next->prev = add;
24 add->next = next;
25 add->prev = prev;
26 prev->next = add;
27 }
28
29 _INLINE_ void list_add(struct list_head *add, struct list_head *head) {
30 __list_add(add, head, head->next);
31 }
32
33 _INLINE_ void list_add_tail(struct list_head *add, struct list_head *head)
34 {
35 __list_add(add, head->prev, head);
36 }
37
38 _INLINE_ void __list_del(struct list_head *prev, struct list_head *next)
39 {
40 next->prev = prev;
41 prev->next = next;
42 }
43
44 _INLINE_ void list_del(struct list_head *entry)
45 {
46 __list_del(entry->prev, entry->next);
47 }
48
49 _INLINE_ void list_del_init(struct list_head *entry)
50 {
51 __list_del(entry->prev, entry->next);
52 INIT_LIST_HEAD(entry);
53 }
54
55 _INLINE_ int list_empty(struct list_head *head)
56 {
57 return head->next == head;
58 }
59
76 #define list_entry(ptr, type, member)
77 ((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member)))
78
79 #define list_for_each(pos, head)
80 for (pos = (head)->next; pos != (head); pos = pos->next)
81
82 #define list_for_each_safe(pos, pnext, head)
83 for (pos = (head)->next, pnext = pos->next; pos != (head);
84 pos = pnext, pnext = pos->next)
85
86 #undef _INLINE_
87 #endif
88
~ 1 #include"list.h"
2 typedef struct m
3 {
4 int a;
5 int b;
6 struct list_head list;
7 }Q;
8 int main(int argc,char *argv[])
9 {
10 int i;
11 Q *p=NULL;
12 struct list_head *ptr=NULL;
13 LIST_HEAD(t);
14 for(i=0;i<10;i++)
15 {
16 p=(Q*)malloc(sizeof(Q));
17 p->a=i;
18 p->b=i+2;
19 list_add(&(p->list),&t);
20 }
21 list_for_each(ptr,&t)
22 {
23 p=list_entry(ptr,Q,list);
24 printf("%d %d
",p->a,p->b);
25
26 }
27 return 0;
28 }