From ea8683c04058a2db361f900fa7eb2e6174a5ed46 Mon Sep 17 00:00:00 2001 From: guishenking Date: Fri, 15 Aug 2025 14:16:46 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0queue=E9=81=8D=E5=8E=86?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/queue/queue.c | 16 ++++++++++++++++ src/lib/queue/queue.h | 2 ++ src/main.c | 21 +++++++-------------- 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/lib/queue/queue.c b/src/lib/queue/queue.c index 56d61c1..c8cb624 100644 --- a/src/lib/queue/queue.c +++ b/src/lib/queue/queue.c @@ -156,6 +156,22 @@ bool queue_peek_at(const queue_t *queue, size_t index, void *value) { return true; } +/** + * @brief 遍历队列 + * + * @param queue + * @param func 回调函数 指定了数据(未指定数据类型)和索引 + */ +void queue_foreach(const queue_t *queue, void (*func)(void *data, size_t index)) { + queue_node_t *node = queue->head; + size_t idx = 0; + while (node) { + func(node->data, idx); + node = node->next; + idx++; + } +} + /** * @brief 抛弃队列前n个数据 * diff --git a/src/lib/queue/queue.h b/src/lib/queue/queue.h index 6a54e82..66ba36a 100644 --- a/src/lib/queue/queue.h +++ b/src/lib/queue/queue.h @@ -42,6 +42,8 @@ bool queue_dequeue_head(queue_t *queue, void *value); bool queue_dequeue_tail(queue_t *queue, void *value); // 查询队列指定位置的数据 bool queue_peek_at(const queue_t *queue, size_t index, void *value); +// 遍历队列 +void queue_foreach(const queue_t *queue, void (*func)(void *data, size_t index)); // 抛弃队列前n个数据 size_t queue_drop_head(queue_t *queue, size_t n); // 抛弃队列尾部n个数据 diff --git a/src/main.c b/src/main.c index f5fe211..fe7a731 100755 --- a/src/main.c +++ b/src/main.c @@ -12,15 +12,8 @@ #include - -void print_queue(const queue_t *queue) { - printf("Queue(size=%zu): ", queue_length(queue)); - for (size_t i = 0; i < queue_length(queue); ++i) { - int val; - queue_peek_at(queue, i, &val); - printf("%d ", val); - } - printf("\n"); +void print_int(void *data, size_t idx) { + printf("Index %zu: %d\n", idx, *(int *)data); } int main(void) { @@ -37,7 +30,7 @@ int main(void) { ret = queue_enqueue(&q, &i); printf("Enqueue %d: %s\n", i, ret ? "OK" : "FAIL"); } - print_queue(&q); + queue_foreach(&q, print_int); // 查询第3个元素 int val = 0; @@ -51,23 +44,23 @@ int main(void) { printf("Dequeue head: %d\n", val); } } - print_queue(&q); + queue_foreach(&q, print_int); // 从尾部出队 if (queue_dequeue_tail(&q, &val)) { printf("Dequeue tail: %d\n", val); } - print_queue(&q); + queue_foreach(&q, print_int); // 抛弃前3个 size_t dropped = queue_drop_head(&q, 3); printf("Drop head 3, actually dropped: %zu\n", dropped); - print_queue(&q); + queue_foreach(&q, print_int); // 抛弃尾部10个(超出队列长度,实际清空) dropped = queue_drop_tail(&q, 10); printf("Drop tail 10, actually dropped: %zu\n", dropped); - print_queue(&q); + queue_foreach(&q, print_int); // 销毁队列 queue_destroy(&q);