C語言雙向循環鏈表api(源自gluster源碼)
阿新 • • 發佈:2018-09-26
void 操作 i+1 null 刪除 strcpy har 定義 判斷 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; }
C語言雙向循環鏈表api(源自gluster源碼)