QTAILQ队列数据结构

QTAILQ队列数据结构

这种数据结构由两种基本结构构成,分别是QTAILQ_ENTRY和QTAILQ_HEAD,前者表示队列的元素,后者表示队列的头。

#define QTAILQ_ENTRY(type) \ union { \ struct type *tqe_next; /* next element */ \ QTailQLink tqe_circ; /* link for circular backwards list */ \ } typedef struct QTailQLink { void *tql_next; struct QTailQLink *tql_prev; } QTailQLink;

entry为一个联合体类型,包含tqe_next和tqe_circ,前者适用于单向链表,后者适用于双向链表。

在构造单向链表时,tqe_next指向链表中的下一个元素。
在构造双向链表时,tqe_circ->tql_next指向链表中的下一个元素,tqe_circ->tql_prev指向链表中上一个元素的tqe_circ。

#define QTAILQ_HEAD(name, type) \ union name { \ struct type *tqh_first; /* first element */ \ QTailQLink tqh_circ; /* link for circular backwards list */ \ }

head与entry结构类似,包含tqh_first和tqh_circ,前者适用于单向链表,后者适用于双向链表。

在构造单向链表时,tqh_first指向链表中的第一个元素。
在构造双向链表时,tqh_circ指向链表中的第一个元素的tqh_circ。

基于这些数据结构,有一些操作。

QTAILQ_INSERT_TAIL(head,elm,field)

#define QTAILQ_INSERT_TAIL(head, elm, field) do { \ (elm)->field.tqe_next = NULL; \ (elm)->field.tqe_circ.tql_prev = (head)->tqh_circ.tql_prev; \ (head)->tqh_circ.tql_prev->tql_next = (elm); \ (head)->tqh_circ.tql_prev = &(elm)->field.tqe_circ; \ } while (/*CONSTCOND*/0)

将新元素elm放入整个链表的最后一个。
最后一个元素的下一个元素肯定为NULL,所以(elm)->field.tqe_next = NULL;
最后一个元素的tqe_circ.tql_prev应该指向之前是最后一个元素的元素,即指向(head)->tqh_circ.tql_prev.
之前是最后一个元素的元素,即(head)->tqh_circ.tql_prev,的下一个元素,应该为elm,所以之前的最后一个元素->tql_next = (elm).
head的prev应该是elm,因此(head)->tqh_circ.tql_prev = &(elm)->field.tqe_circ.

QTAILQ_INSERT_AFTER(head, listelm, elm, field)
向队列中的某元素后插入一个新的元素

QTAILQ_INSERT_BEFORE(listelm,elm,field)
向队列中的某元素前插入一个新的元素


__EOF__

本文作者EwanHai
本文链接https://www.cnblogs.com/haiyonghao/p/14440753.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   EwanHai  阅读(703)  评论(1编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示