接触到的一些数据结构: LIST_ENTRY, TAILQ
双链表:
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)
接触到的一些数据结构: LIST_ENTRY, TAILQ的更多相关文章
- JDK,常见数据结构解读
一.情有独钟 对数据结构情有独钟,打算慢慢把jdk里的实现都读一遍,发现其中的亮点,持续更新. 二.ArrayList 这应该是我们学习java最早接触的到的数据结构,众所周知,数组在申请了内存之后, ...
- 20172329 2018-2019《Java程序设计与数据结构》课程总结
作者:lalalouye(20172329王文彬) 2018-2019年大二Java程序设计与数据结构课程总目录:第一周 第二周 第三周 第四周 第五周 第六周 第七周 第八周 第九周 实验一 实验二 ...
- NOIP注意事项
高精度 a.加法 b.减法 c.乘法(应该只会有高精乘单精) d.高精度除单精 (后面c,d考的可能性较小 ...
- Linux设备驱动工程师之路——内核链表的使用【转】
本文转载自:http://blog.csdn.net/forever_key/article/details/6798685 Linux设备驱动工程师之路——内核链表的使用 K-Style 转载请注明 ...
- 给jdk写注释系列之jdk1.6容器(10)-Stack&Vector源码解析
前面我们已经接触过几种数据结构了,有数组.链表.Hash表.红黑树(二叉查询树),今天再来看另外一种数据结构:栈. 什么是栈呢,我就不找它具体的定义了,直接举个例子,栈就相当于一个很窄的木桶 ...
- JAVA提高十八:Vector&Stack深入分析
前面我们已经接触过几种数据结构了,有数组.链表.Hash表.红黑树(二叉查询树),今天再来看另外一种数据结构:栈. 什么是栈呢,我们先看一个例子:栈就相当于一个很窄的木桶,我们往木桶里放东西,往外拿东 ...
- linux内核链表的使用
linux内核链表:链表通常包括两个域:数据域和指针域.struct list_head{struct list_head *next,*prev;};include/linux/list.h中实现了 ...
- 最近面试 Java 后端开发的感受!
阅读本文大概需要 4.3 分钟. 首发:cnblogs.com/JavaArchitect/p/10011253.html 上周,密集面试了若干位Java后端候选人,工作经验在3到5年间.我的标准其实 ...
- 最近面试java后端开发的感受:如果就以平时项目经验来面试,通过估计很难——再论面试前的准备
在上周,我密集面试了若干位Java后端的候选人,工作经验在3到5年间.我的标准其实不复杂:第一能干活,第二Java基础要好,第三最好熟悉些分布式框架,我相信其它公司招初级开发时,应该也照着这个标准来面 ...
随机推荐
- 构建vue零散笔记
# vue项目(用webpack构建)的前提是已安装了node.js,vue,vue-cli,webpack # 主要命令构建:vue init webpack 项目名(纯英文,且不可驼峰)运行:np ...
- 来自一枚初生牛犊不怕虎的小菜鸟的Mock.js使用,不足之处欢迎读者的指出 谢谢
本文章写的是基于require的mock.js的几种常用生成随机数据和ajax模拟前后端的交互信息 <script src="./app/libs/require.js"&g ...
- jquery添加html代码的几种方法
经常用jq来DOM添加html代码 就总结了jq里面最常用的动态添加html代码的方法 append在元素内部的尾部加上元素 prepend在元素内部的前部加上元素 after在元素外部的尾部加上元素 ...
- Angular简单总结
AngularJS AngularJS四大特征 MVC模式 双向绑定 依赖注入 模块化设计 AngularJS 表达式 AngularJS 表达式写在双大括号内{{expression }},可以包含 ...
- 微信小程序-通知公告滚动提示
wxml如下: <view class='scroll_view_border'> <view class="srcoll_view" bindtap=" ...
- Mysql基础1-基础语法-字段类型
主要: 基础 字段类型 基础 基本概念 1) 数据库分类 层次数据库,网状数据库,关系数据库 常见:SQL Server, Oracle,infomix,sybase,ibmDB2,Mysql 2)数 ...
- python中协程实现的本质以及两个封装协程模块greenle、gevent
协程 协程,又称微线程,纤程.英文名Coroutine. 协程是啥 协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源). 为啥说它是一个执行单元,因为 ...
- Redis缓存数据库的安装与配置(2)
1.为php安装redis客户端扩展 wget https://github.com/nicolasff/phpredis/archive/master.zip tar xf phpredis-mas ...
- 50-Identity MVC:DbContextSeed初始化
1-创建一个可以启动时如果没有一个账号刚创建1个新的账号 namespace MvcCookieAuthSample.Data { public class ApplicationDbContextS ...
- 从0开始 java 网站开发(jsp)【1】
前提:安装java 并配置环境变量 java下载地址: http://www.java.com/zh_CN/ 环境变量配置 本地PC路径: 电脑--属性--高级--环境变量 在系统变量中: 新建 名: ...