next = list;list->prev = list;}void __list_add(struct list_head *。Linux- struct list_head简介( 三 )。" />

Linux- struct list_head简介( 三 )


list.c
#include#include #include #include #include #include "list.h"//动态初始化void INIT_LIST_HEAD(struct list_head *list){list->next = list;list->prev = list;}void __list_add(struct list_head *new,struct list_head *prev,struct list_head *next){next->prev = new;new->next = next;new->prev = prev;prev->next = new;}void list_add_tail(struct list_head *new, struct list_head *head){__list_add(new, head->prev, head);}void list_add(struct list_head *new, struct list_head *head){__list_add(new, head, head->next);}void __list_del(struct list_head * prev, struct list_head * next){next->prev = prev;prev->next = next;}void list_del(struct list_head *entry){__list_del(entry->prev, entry->next);// entry->next = LIST_POISON1;// entry->prev = LIST_POISON2;}int list_empty(const struct list_head *head){return head->next == head;}void display_list(struct list_head *list_head){int i=0;struct list_head *p;struct qingmu *entry;printf("-------list---------\n");list_for_each(p,list_head){printf("node[%d]\n",i++);entry=list_entry(p,struct qingmu,list);printf("\tage: %d\n",entry->age);printf("\tweight: %d\n",entry->weight);}printf("-------end----------\n");}
#include "list.h"#include#include #include #include #include struct list_head myhead;int main(){int ret =0,i=0;//struct list_head *p,*q;//Qingmu_t *entry;INIT_LIST_HEAD(&myhead);//初始化链表ret = list_empty(&myhead);if(ret){printf("list is empty\n");}struct qingmumu;mu.age = 18;mu.weight = 60;struct qingmumu1;mu1.age = 19;mu1.weight = 61;struct qingmumu2;mu2.age = 20;mu2.weight = 62;list_add(&mu.list,&myhead);list_add(&mu1.list,&myhead);list_add(&mu2.list,&myhead);ret = list_empty(&myhead);if(ret){printf("list is empty\n");}else{printf("list is not empty\n");}display_list(&myhead);return 0;}
执行结果如下:
后续链表中还可以实现不同的数据结构的嵌套 。而且还有很多API都可以在/linux/list.h中找到 。