linux 内核链表的应用

来源:互联网 发布:河南比尔软件科技 编辑:程序博客网 时间:2024/06/14 21:52


内核版本:kernel 3.0.1#include <stdio.h>#include <stdlib.h>#include <sys/queue.h>struct ElemType{        int num;        char *ptr;        LIST_ENTRY(ElemType) entries;};LIST_HEAD(List, ElemType);static struct List gListHead;// linux自带的LIST_END用不了,可能是要什么头文件,或者编译时候需要某个库支持,但是我暂时还没找到驾驭LIST_END的方法。// (若有哪位大虾知道还请告知)// 下面是我自己模仿linux的LIST_END函数头写的。struct ElemType* LIST_END(struct List *list){        struct ElemType *recv = NULL;        struct ElemType *elem = NULL;        LIST_FOREACH(elem, list, entries)        {                if (elem && elem->entries.le_next == NULL)                {                        recv = elem;                }        }        return recv;}// 尾部插入。linux没有提供(反正我没找到,若有哪位大虾知道还请告知)尾部插入的方法,只能自己实现了。//void LIST_INSERT_TAIL(struct List *list, struct ElemType *elem, LIST_ENTRY name) // LIST_ENTRY不能通过编译,why?void LIST_INSERT_TAIL(struct List *list, struct ElemType *elem){        struct ElemType *tail = LIST_END(list);        if (tail)        {                LIST_INSERT_AFTER(tail, elem, entries);        }        else        {                LIST_INSERT_HEAD(list, elem, entries);        }}int main(){        LIST_INIT(&gList);        struct ElemType *elem1 = (struct ElemType *)malloc(sizeof(struct ElemType));        struct ElemType *elem2 = (struct ElemType *)malloc(sizeof(struct ElemType));        struct ElemType *elem3 = (struct ElemType *)malloc(sizeof(struct ElemType));        elem1->num = 11;        elem2->num = 22;        elem3->num = 33;        // insert in the head        LIST_INSERT_HEAD(&gList, elem1, entries);        LIST_INSERT_HEAD(&gList, elem2, entries);        LIST_INSERT_HEAD(&gList, elem3, entries);        // insert in the tail        //LIST_INSERT_TAIL(&gList, elem1);        //LIST_INSERT_TAIL(&gList, elem2);        //LIST_INSERT_TAIL(&gList, elem3);        struct ElemType *elem;        // 采用 for 循环遍历        for (elem = gList.lh_first; elem; elem = elem->entries.le_next)        {                printf("using for, num = %d\n", elem->num);                if (elem->num == 22)                {                        LIST_REMOVE(elem, entries);                        free(elem);                        //elem->num = 99;                }        }        // 采用 LIST_FOREACH 遍历        LIST_FOREACH(elem, &gList, entries)        {                printf("using LIST_FOREACH, num = %d\n", elem->num);                //if (elem->num == 33)                {                        LIST_REMOVE(elem, entries);                        free(elem);                }        }        LIST_FOREACH(elem, &gList, entries)        {                printf("using LIST_FOREACH, num = %d\n", elem->num);        }        return 0;}

0 0
原创粉丝点击