#ifndef __LINKEDLIST_H_#define __LINKEDLIST_H_#include#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类型不匹配,编译时便会有warnningtypedef struct tagStListNode{ struct tagStListNode *pstNext;}StListNode;typedef struct tagStListHead{ StListNode *pstFirstNode;}StListHead;#define LIST_ENTRY(ptr, type, member) \container_of(ptr, type, member)#ifdef __cplusplusextern "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;}