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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值