C语言双向循环链表api(源自gluster源码)
基本的操作如增加、删除和遍历等

#include <stdio.h>#include <stdlib.h>#include <string.h>/*定义表头*/struct list_head { struct list_head *next; struct list_head *prev;};/*表头初始化*/#define INIT_LIST_HEAD(head) do { \ (head)->next = (head)->prev = head; \ } while (0)/*增加*/static inline voidlist_add (struct list_head *new, struct list_head *head){ new->prev = head; new->next = head->next; new->prev->next = new; new->next->prev = new;}/*删除*/static inline voidlist_del (struct list_head *old){ old->prev->next = old->next; old->next->prev = old->prev; old->next = (void *)0xbabebabe; old->prev = (void *)0xcafecafe;}/*判断链表是否为空*/static inline intlist_empty (struct list_head *head){ return (head->next == head);}#define list_entry(ptr, type, member) \ ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))#define list_for_each(pos, head) \ for (pos = (head)->next; pos != (head); pos = pos->next)/*遍历,关于list_for_each_entry,百度*/#define list_for_each_entry(pos, head, member) \ for (pos = list_entry((head)->next, typeof(*pos), member); \ &pos->member != (head); \ pos = list_entry(pos->member.next, typeof(*pos), member))/*例:先定义一个结构体*/typedef struct student{ int num; //学号 int score; //分数 char name[20]; struct list_head student_list;}STU;STU *head=NULL;int main(void){ STU *new=NULL; new = (STU *)malloc(sizeof(STU)); bzero(new, sizeof(STU)); new->num = 8; new->score = 8; strcpy(new->name, "8888"); /*链表初始化*/ if(head == NULL) { // head = (STU *)malloc(sizeof(STU)); // bzero(head, sizeof(STU)); head = new; INIT_LIST_HEAD(&head->student_list); } else { list_add(&new->student_list, &head->student_list); } if(list_empty(&head->student_list)) { printf("list only head\n"); printf("head->num:%d, score:%d, name:%s\n", head->num, head->score, head->name); } /*将新成员插入链表*/ int i; for(i=0;i<5;i++) { new = (STU *)malloc(sizeof(STU)); bzero(new, sizeof(STU)); new->num = i; new->score = i+1; strcpy(new->name, "2233"); list_add(&new->student_list, &head->student_list); } /*删除指定的成员*/ STU *pos=NULL; list_for_each_entry(pos, &head->student_list, student_list) { if(pos->num == 2){ list_del(&pos->student_list); free(pos); pos = NULL; break; // printf("num:%d, score:%d, name:%s\n", pos->num, pos->score, pos->name); } } /*遍历链表*/ list_for_each_entry(pos, &head->student_list, student_list) { printf("num:%d, score:%d, name:%s\n", pos->num, pos->score, pos->name); } return 0;}