C语言双向循环链表api(源自gluster源码)
2018-09-26 11:30
603 查看
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 void list_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 void list_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 int list_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; }
相关文章推荐
- Linux内核2.6.14源码分析-双向循环链表代码分析(巨详细)
- 双向循环链表基本操作的实现(C语言)
- 链表的C语言实现之循环链表及双向链表
- C语言中双向链表和双向循环链表详解
- 双向循环链表 C语言通用编程的思考
- 双向循环链表的C语言实现
- c语言写双向循环链表
- C语言双向循环链表的生成,删除和打印
- 双向循环链表基本操作(C语言)
- c语言_数据结构_双向循环链表
- 链表的C语言实现之循环链表及双向链表
- (8) Java源码分析 ---- LinkedList (对应数据结构中线性表中的双向循环链表,JDK1.6)
- c语言:双向循环链表的实现
- C语言中的双向循环链表
- C语言-----循环双向链表(增加文件读写链表功能)
- C语言实现双向循环链表
- 链表的C语言实现之循环链表及双向链表
- C语言实现双向循环链表
- 双向循环链表头文件C语言
- linux中C语言实现双向循环链表