环形队列实现

本文详细介绍了环形队列(Circle Queue)的数据结构定义和一系列操作方法,包括初始化、插入元素(在头部、尾部、指定元素之后、指定元素之前)、遍历、删除元素以及替换元素。这些定义和操作适用于环形队列的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
 * Circular queue definitions.
 */
#define CIRCLEQ_HEAD(name, type)     \
struct name {        \
 struct type *cqh_first;  /* first element */  \
 struct type *cqh_last;  /* last element */  \
}
#define CIRCLEQ_HEAD_INITIALIZER(head)     \
 { CIRCLEQ_END(&head), CIRCLEQ_END(&head) }
#define CIRCLEQ_ENTRY(type)      \
struct {        \
 struct type *cqe_next;  /* next element */  \
 struct type *cqe_prev;  /* previous element */  \
}
/*
 * Circular queue access methods
 */
#define CIRCLEQ_FIRST(head)  ((head)->cqh_first)
#define CIRCLEQ_LAST(head)  ((head)->cqh_last)
#define CIRCLEQ_END(head)  ((void *)(head))
#define CIRCLEQ_NEXT(elm, field) ((elm)->field.cqe_next)
#define CIRCLEQ_PREV(elm, field) ((elm)->field.cqe_prev)
#define CIRCLEQ_EMPTY(head)      \
 (CIRCLEQ_FIRST(head) == CIRCLEQ_END(head))
#define CIRCLEQ_FOREACH(var, head, field)    \
 for((var) = CIRCLEQ_FIRST(head);    \
     (var) != CIRCLEQ_END(head);     \
     (var) = CIRCLEQ_NEXT(var, field))
#define CIRCLEQ_FOREACH_REVERSE(var, head, field)   \
 for((var) = CIRCLEQ_LAST(head);     \
     (var) != CIRCLEQ_END(head);     \
     (var) = CIRCLEQ_PREV(var, field))
/*
 * Circular queue functions.
 */
#define CIRCLEQ_INIT(head) do {      \
 (head)->cqh_first = CIRCLEQ_END(head);    \
 (head)->cqh_last = CIRCLEQ_END(head);    \
} while (0)
#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do {  \
 (elm)->field.cqe_next = (listelm)->field.cqe_next;  \
 (elm)->field.cqe_prev = (listelm);    \
 if ((listelm)->field.cqe_next == CIRCLEQ_END(head))  \
  (head)->cqh_last = (elm);    \
 else        \
  (listelm)->field.cqe_next->field.cqe_prev = (elm); \
 (listelm)->field.cqe_next = (elm);    \
} while (0)
#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do {  \
 (elm)->field.cqe_next = (listelm);    \
 (elm)->field.cqe_prev = (listelm)->field.cqe_prev;  \
 if ((listelm)->field.cqe_prev == CIRCLEQ_END(head))  \
  (head)->cqh_first = (elm);    \
 else        \
  (listelm)->field.cqe_prev->field.cqe_next = (elm); \
 (listelm)->field.cqe_prev = (elm);    \
} while (0)
#define CIRCLEQ_INSERT_HEAD(head, elm, field) do {   \
 (elm)->field.cqe_next = (head)->cqh_first;   \
 (elm)->field.cqe_prev = CIRCLEQ_END(head);   \
 if ((head)->cqh_last == CIRCLEQ_END(head))   \
  (head)->cqh_last = (elm);    \
 else        \
  (head)->cqh_first->field.cqe_prev = (elm);  \
 (head)->cqh_first = (elm);     \
} while (0)
#define CIRCLEQ_INSERT_TAIL(head, elm, field) do {   \
 (elm)->field.cqe_next = CIRCLEQ_END(head);   \
 (elm)->field.cqe_prev = (head)->cqh_last;   \
 if ((head)->cqh_first == CIRCLEQ_END(head))   \
  (head)->cqh_first = (elm);    \
 else        \
  (head)->cqh_last->field.cqe_next = (elm);  \
 (head)->cqh_last = (elm);     \
} while (0)
#define CIRCLEQ_REMOVE(head, elm, field) do {    \
 if ((elm)->field.cqe_next == CIRCLEQ_END(head))   \
  (head)->cqh_last = (elm)->field.cqe_prev;  \
 else        \
  (elm)->field.cqe_next->field.cqe_prev =   \
      (elm)->field.cqe_prev;    \
 if ((elm)->field.cqe_prev == CIRCLEQ_END(head))   \
  (head)->cqh_first = (elm)->field.cqe_next;  \
 else        \
  (elm)->field.cqe_prev->field.cqe_next =   \
      (elm)->field.cqe_next;    \
} while (0)
#define CIRCLEQ_REPLACE(head, elm, elm2, field) do {   \
 if (((elm2)->field.cqe_next = (elm)->field.cqe_next) ==  \
     CIRCLEQ_END(head))      \
  (head).cqh_last = (elm2);    \
 else        \
  (elm2)->field.cqe_next->field.cqe_prev = (elm2); \
 if (((elm2)->field.cqe_prev = (elm)->field.cqe_prev) ==  \
     CIRCLEQ_END(head))      \
  (head).cqh_first = (elm2);    \
 else        \
  (elm2)->field.cqe_prev->field.cqe_next = (elm2); \
} while (0)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值