增加queue遍历功能函数
This commit is contained in:
@@ -156,6 +156,22 @@ bool queue_peek_at(const queue_t *queue, size_t index, void *value) {
|
|||||||
return true;
|
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个数据
|
* @brief 抛弃队列前n个数据
|
||||||
*
|
*
|
||||||
|
@@ -42,6 +42,8 @@ bool queue_dequeue_head(queue_t *queue, void *value);
|
|||||||
bool queue_dequeue_tail(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);
|
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个数据
|
// 抛弃队列前n个数据
|
||||||
size_t queue_drop_head(queue_t *queue, size_t n);
|
size_t queue_drop_head(queue_t *queue, size_t n);
|
||||||
// 抛弃队列尾部n个数据
|
// 抛弃队列尾部n个数据
|
||||||
|
21
src/main.c
21
src/main.c
@@ -12,15 +12,8 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
|
void print_int(void *data, size_t idx) {
|
||||||
void print_queue(const queue_t *queue) {
|
printf("Index %zu: %d\n", idx, *(int *)data);
|
||||||
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");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(void) {
|
int main(void) {
|
||||||
@@ -37,7 +30,7 @@ int main(void) {
|
|||||||
ret = queue_enqueue(&q, &i);
|
ret = queue_enqueue(&q, &i);
|
||||||
printf("Enqueue %d: %s\n", i, ret ? "OK" : "FAIL");
|
printf("Enqueue %d: %s\n", i, ret ? "OK" : "FAIL");
|
||||||
}
|
}
|
||||||
print_queue(&q);
|
queue_foreach(&q, print_int);
|
||||||
|
|
||||||
// 查询第3个元素
|
// 查询第3个元素
|
||||||
int val = 0;
|
int val = 0;
|
||||||
@@ -51,23 +44,23 @@ int main(void) {
|
|||||||
printf("Dequeue head: %d\n", val);
|
printf("Dequeue head: %d\n", val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
print_queue(&q);
|
queue_foreach(&q, print_int);
|
||||||
|
|
||||||
// 从尾部出队
|
// 从尾部出队
|
||||||
if (queue_dequeue_tail(&q, &val)) {
|
if (queue_dequeue_tail(&q, &val)) {
|
||||||
printf("Dequeue tail: %d\n", val);
|
printf("Dequeue tail: %d\n", val);
|
||||||
}
|
}
|
||||||
print_queue(&q);
|
queue_foreach(&q, print_int);
|
||||||
|
|
||||||
// 抛弃前3个
|
// 抛弃前3个
|
||||||
size_t dropped = queue_drop_head(&q, 3);
|
size_t dropped = queue_drop_head(&q, 3);
|
||||||
printf("Drop head 3, actually dropped: %zu\n", dropped);
|
printf("Drop head 3, actually dropped: %zu\n", dropped);
|
||||||
print_queue(&q);
|
queue_foreach(&q, print_int);
|
||||||
|
|
||||||
// 抛弃尾部10个(超出队列长度,实际清空)
|
// 抛弃尾部10个(超出队列长度,实际清空)
|
||||||
dropped = queue_drop_tail(&q, 10);
|
dropped = queue_drop_tail(&q, 10);
|
||||||
printf("Drop tail 10, actually dropped: %zu\n", dropped);
|
printf("Drop tail 10, actually dropped: %zu\n", dropped);
|
||||||
print_queue(&q);
|
queue_foreach(&q, print_int);
|
||||||
|
|
||||||
// 销毁队列
|
// 销毁队列
|
||||||
queue_destroy(&q);
|
queue_destroy(&q);
|
||||||
|
Reference in New Issue
Block a user