双链表:

LIST_ENTRY:

typedef struct _LIST_ENTRY {
struct _LIST_ENTRY  *Flink; follow: next entry, header if it is the last entry in the list
struct _LIST_ENTRY  *Blink; before: previous entry, header if it is the first entry in the list
} LIST_ENTRY, *PLIST_ENTRY;
链表空是,header->Flink == header->Blink == &header; 这是初始化头部时的动作。
//code expample
typedef struct _MY_STRUCT{
NDIS_SPIN_LOCK spinLock;
LIST_ENTRY header;
}MY_STRUCT,PMY_STRUCT;//header typedef struct _MY_PACKET{
LIST_ENYRY entry;
xxx
xxx
}MY_PACKET,PMP_PACKET;// each element PMY_STRUCT pMyStruct = alloc_mem();
//初始化链表头:
InitializeListHead(&pMyStruct->header);
//创建整个链表:
for(int i=;i<num_packets;i++){
PMP_PACKET pMyPacket= alloc_mem();
NdisInterlockedInsertTailList(&pMyStruct->header,&pMyPacket->entry,pMyStruct->spinLock);
}//here,整个双链表已经创建完成。 //想要用这个链表的时候,very easy,用的时候从头部取,用完插到链表尾:
PLIST_ENTRY listEntry;
listEntry = NdisInterlockedRemoveHeadList(&pMyStruct->header,pMyStruct->spinLock);
PMP_PACKET pPacket = CONTAINING_RECORD(listEntry,MY_PACKET, Entry);
//用完之后继续放到链表尾部:
NdisInterlockedInsertTailList(&pMyStruct->header,&pPacket->entry,pMyStruct->spinLock);
 

TAILQ_ENTRY

#define TAILQ_HEAD(name, type) \

struct name { \
struct type *tqh_first; /* first element */ \
struct type **tqh_last; /* addr of last next element */\
} #define TAILQ_ENTRY(type) \
struct { \
struct type *tqe_next; /* next element */ \
struct type **tqe_prev; /* address of previous next element */ \
TRACEBUF \
} #define TAILQ_INIT(head) do { \
(head)->tqh_first = NULL; \
(head)->tqh_last = &(head)->tqh_first; \
} while () #define TAILQ_INSERT_TAIL(head, elm, field) do { \
(elm)->field.tqe_next = NULL; \
(elm)->field.tqe_prev = (head)->tqh_last; \
*(head)->tqh_last = (elm); \
(head)->tqh_last = &(elm)->field.tqe_next; \
} while () #define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \
(elm)->field.tqe_prev = (listelm)->field.tqe_prev; \
(elm)->field.tqe_next = (listelm); \
*(listelm)->field.tqe_prev = (elm); \
(listelm)->field.tqe_prev = &(elm)->field.tqe_next; \
} while () #define TAILQ_FIRST(head) ((head)->tqh_first)
#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next)

最新文章

  1. PHPCMS导航栏当前栏目选中方法
  2. 深入理解javascript原型和闭包(15)——闭包
  3. STL set 用法
  4. Tomcat服务启动成功,但访问index.jsp出错 (jspInit)
  5. latextools \cite 自动补全
  6. 拦路虎:jQuery
  7. C++11的一些新特性
  8. 【LeetCode】66 &amp; 67- Plus One &amp; Add Binary
  9. 六、Android学习笔记_JNI_c调用java代码
  10. SOAP Web 服务介绍
  11. JDK动态代理实现简单AOP--转
  12. web前端开发框架搜集
  13. POJ 1743 Musical Theme(不可重叠最长重复子串)
  14. javascript每日一练(八)——事件三:默认行为
  15. [Programming WCF Services]Chapter&#160;1.&#160;WCF Essentials - EndPoint
  16. [面试]Actor模型
  17. php hook编程机制
  18. element UI table 过滤 筛选问题
  19. Linux扩展分区记录
  20. Recurrences UVA - 10870 (斐波拉契的一般形式推广)

热门文章

  1. 用python爬取小说章节内容
  2. shardedJedisPool工具类
  3. window系统下pycharm的破解配置
  4. 《Linux 性能优化实战—倪朋飞 》学习笔记 CPU 篇
  5. Linux给当前用户指定目录授权命令
  6. java中方法的参数传递机制_一个对象被当作参数传递到一个方法后
  7. Django之模型---ORM简介
  8. JS正则表达式笔记
  9. Java线程和多线程(十)——TimerTask
  10. 初步学习pg_control文件之十二