一、测试源程序:
【 list.h 文件 】
1 #ifndef _LIST_HEAD_ 2 #define _LIST_HEAD_ 3 4 /* 链表节点结构 */ 5 struct list_head { 6 struct list_head *prev; 7 struct list_head *next; 8 }; 9 10 /* 初始化链表 */ 11 #define LIST_HEAD_INIT(name) \ 12 {&(name), &(name)} 13 14 /* 创建链表并初始化 */ 15 #define LIST_HEAD(name) \ 16 struct list_head name = LIST_HEAD_INIT(name) 17 18 /* 得到结构体头至某成员的偏移量 */ 19 #define offsetof(type, member) \ 20 ((void*)(&((type*)0)->member)) 21 22 /* 由成员地址得到结构体首地址 */ 23 #define container_of(ptr, type, member) \ 24 ((type*)((void*)ptr-offsetof(type, member))) 25 26 /* 链表中插入新节点 */ 27 static inline void _list_add(struct list_head *new, 28 struct list_head *prev, struct list_head *next) 29 { 30 next->prev = new; 31 prev->next = new; 32 new->prev = prev; 33 new->next = next; 34 } 35 36 #endif
【 list.c 文件 】
1 #include <stdio.h> 2 #include "list.h" 3 4 #define list_entry(ptr, type, member) \ 5 container_of(ptr, type, member) 6 7 /* 利用 ptr 等于 head, 从而得到首个数据节点 */ 8 #define list_first_entry(ptr, type, member) \ 9 list_entry((ptr)->next, type, member) 10 11 /* 遍历整个链表, 得到第个数据节点的结构体基址 */ 12 #define list_for_each_entry(entry, head, member)\ 13 for(entry=list_first_entry(head,typeof(*entry),member); \ 14 &(entry)->member!=head; \ 15 entry=list_entry((entry)->member.next,typeof(*entry),member)) 16 17 /* 自定义三个测试变量 */ 18 struct student_info { 19 char *name; 20 struct list_head list; 21 }xiaoming, xiaoqing, xiaoling; 22 23 /* 从尾部插入新的数据节点 */ 24 void list_add_tail(struct list_head *new, 25 struct list_head *head) 26 { 27 _list_add(new, head->prev, head); 28 } 29 30 /* 创建链表并初始化 */ 31 static LIST_HEAD(info_list); 32 33 int main() 34 { 35 struct student_info *info = NULL; 36 37 /* 初始化成员信息 */ 38 xiaoming.name = "xiao_ming"; 39 xiaoqing.name = "xiao_qing"; 40 xiaoling.name = "xiao_ling"; 41 42 /* 插入链表 */ 43 list_add_tail(&xiaoming.list, &info_list); 44 list_add_tail(&xiaoqing.list, &info_list); 45 list_add_tail(&xiaoling.list, &info_list); 46 47 /* 遍历测试 */ 48 list_for_each_entry(info, &info_list, list) 49 puts(info->name); 50 51 return 0; 52 }
二、运行结果:
$ ./a.out xiao_ming xiao_qing xiao_ling
来源:https://www.cnblogs.com/GyForever1004/p/12418931.html