Linux共享库 Linux内核链表

#ifndef __LINKEDLIST_H_
#define __LINKEDLIST_H_

#include <stdlib.h>

#define offsetof(type, member) ((size_t)&((type *)0)->member)

#define container_of(ptr, type, member) ({\
const typeof(((type *)0)->member) *__mptr = (ptr);\
(type *)((char *)__mptr - offsetof(type,member));})

// "const typeof(((type *)0)->member) *__mptr = (ptr);"
//开发者使用时输入的参数有问题:ptr与member类型不匹配,编译时便会有warnning

typedef struct tagStListNode
{
    struct tagStListNode *pstNext;
}StListNode;

typedef struct tagStListHead
{
    StListNode *pstFirstNode;
}StListHead;

#define LIST_ENTRY(ptr, type, member) \
container_of(ptr, type, member)


#ifdef __cplusplus
extern "C"
{
#endif
    StListNode * List_First(StListHead *pstHead);

    void List_PushBack(StListHead *pstHead, StListNode *pstNode);

    StListNode * List_PopFront(StListHead *pstHead);
    
#define FOREACH(pstHead, pstEntry, member) \
for(pstEntry = LIST_ENTRY(List_First(pstHead), typeof(*pstEntry), member); \
pstEntry != NULL; \
pstEntry = (pstEntry->member.pstNext)? LIST_ENTRY(pstEntry->member.pstNext, typeof(*pstEntry), member) : NULL)


#ifdef __cplusplus
}
#endif

#endif
#include "linkedlist.h"

StListNode * List_First(StListHead *pstHead)
{
    StListNode *pstCurNode = NULL;

    if (NULL == pstHead)
    {
        return NULL;
    }

    pstCurNode = pstHead->pstFirstNode;

    return pstCurNode;
}

void List_PushBack(StListHead *pstHead, StListNode *pstNode)
{
    StListNode *pstCurNode = NULL;

    if (NULL == pstHead || NULL == pstNode)
    {
        return;
    }
    pstCurNode = pstHead->pstFirstNode;
    if (NULL == pstCurNode)
    {
        pstHead->pstFirstNode = pstNode;
        return;
    }

    while (pstCurNode->pstNext)
    {
        pstCurNode = pstCurNode->pstNext;
    }

    pstCurNode->pstNext = pstNode;
}

StListNode * List_PopFront(StListHead *pstHead)
{
    StListNode *pstCurNode = NULL;
    StListNode *pstNextNode = NULL;

    if (NULL == pstHead)
    {
        return NULL;
    }

    pstCurNode = pstHead->pstFirstNode;
    if (NULL == pstCurNode)
    {
        return NULL;
    }

    pstNextNode = pstCurNode->pstNext;
    pstHead->pstFirstNode = pstNextNode;

    return pstCurNode;
}

 

posted on 2018-08-30 22:02  寒魔影  阅读(207)  评论(0编辑  收藏  举报

导航