zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    android AsyncTask 详细例子(2)
    解决如何让AsyncTask终止操作
    Android模仿jquery异步请求
    const与define的异同
    PHP5生成图形验证码(有汉字)
    TPCC-UVA测试环境搭建与结果分析
    qconbeijing2018
    qconshanghai2015
    qconshanghai2017
    qconshanghai2016
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/9562978.html
Copyright © 2011-2022 走看看