From ca4ab10123923fe613454a1b059487776709e32a Mon Sep 17 00:00:00 2001 From: jf-home Date: Sun, 27 Apr 2025 01:16:22 +0800 Subject: [PATCH] =?UTF-8?q?deque=E5=8C=BA=E5=88=86=E6=AD=A3=E5=90=91?= =?UTF-8?q?=E5=92=8C=E5=8F=8D=E5=90=91=E9=81=8D=E5=8E=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/deque.h | 8 +++++++- include/iterator.h | 2 ++ src/deque.c | 31 ++++++++++++++++++++++++------- test/test_deque.c | 17 ++++++++++++----- test/test_graph.c | 10 +++++----- 5 files changed, 50 insertions(+), 18 deletions(-) diff --git a/include/deque.h b/include/deque.h index 6f173d5..ea6c0b6 100644 --- a/include/deque.h +++ b/include/deque.h @@ -13,6 +13,12 @@ #include "common.h" +enum _deque_order +{ + DEQUE_FORWARD, + DEQUE_REVERSE, +}; + struct _deque_node { void* obj; @@ -50,7 +56,7 @@ struct _deque bool (*clear)(struct _deque* self); // iter - iterator_t (*iter)(struct _deque* self); + iterator_t (*iter)(struct _deque* self, enum _deque_order order); // ohters bool (*insert)(struct _deque* self, int index, void* obj); diff --git a/include/iterator.h b/include/iterator.h index fefb810..d10af66 100644 --- a/include/iterator.h +++ b/include/iterator.h @@ -20,6 +20,8 @@ struct _iterator void* _cur_node; uint32_t _cur; + uint32_t _order; + // ---------- public ---------- bool (*hasnext)(struct _iterator* self); const void* (*next)(struct _iterator* self); diff --git a/src/deque.c b/src/deque.c index acecc0f..8813a8d 100644 --- a/src/deque.c +++ b/src/deque.c @@ -295,14 +295,22 @@ static void deque_print(struct _deque* self) } } -iterator_t deque_iter(struct _deque* self) +iterator_t deque_iter(struct _deque* self, enum _deque_order order) { assert(self != NULL); iterator_t iter = &self->_iter; iter->_parent = self; iter->_cur = 0; - iter->_cur_node = self->_head; + iter->_order = order; + if(iter->_order == DEQUE_FORWARD) + { + iter->_cur_node = self->_head; + } + else + { + iter->_cur_node = self->_tail; + } return iter; } @@ -327,13 +335,22 @@ const void* deque_iter_next(struct _iterator* iter) deque_t self = (deque_t)iter->_parent; void *obj = NULL; - // base on linklist - struct _deque_node * node = (struct _deque_node *)iter->_cur_node; - if(node != NULL) + struct _deque_node * cur_node = (struct _deque_node *)iter->_cur_node; + if(cur_node == NULL) { - obj = node->obj; - iter->_cur_node = node->next; + return NULL; } + + obj = cur_node->obj; + if(iter->_order == DEQUE_FORWARD) + { + iter->_cur_node = cur_node->next; + } + else + { + iter->_cur_node = cur_node->prev; + } + self->_iter._cur += 1; return obj; } diff --git a/test/test_deque.c b/test/test_deque.c index e9a6106..58baff5 100644 --- a/test/test_deque.c +++ b/test/test_deque.c @@ -267,7 +267,7 @@ static void test_deque_struct(void) static void test_deque_iter(void) { uint32_t i = 0; - int data[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + int data[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int temp = 0; uint32_t len = sizeof(data) / sizeof(data[0]); @@ -288,26 +288,33 @@ static void test_deque_iter(void) TEST_ASSERT_EQUAL_INT(i + 1, deque->size(deque)); } - iterator_t iter = deque->iter(deque); + iterator_t iter = deque->iter(deque, DEQUE_FORWARD); i = 0; while(iter->hasnext(iter)) { temp = *(int *)iter->next(iter); - // printf("%d ", temp); TEST_ASSERT_EQUAL_INT(data[i], temp); i++; } - iter = deque->iter(deque); + iter = deque->iter(deque, DEQUE_FORWARD); i = 0; while(iter->hasnext(iter)) { temp = *(int *)iter->next(iter); - // printf("%d ", temp); TEST_ASSERT_EQUAL_INT(data[i], temp); i++; } + iter = deque->iter(deque, DEQUE_REVERSE); + i = len - 1; + while(iter->hasnext(iter)) + { + temp = *(int *)iter->next(iter); + TEST_ASSERT_EQUAL_INT(data[i], temp); + i--; + } + deque_free(&deque); TEST_ASSERT_NULL(deque); } diff --git a/test/test_graph.c b/test/test_graph.c index 0d2b43c..15fb70d 100644 --- a/test/test_graph.c +++ b/test/test_graph.c @@ -149,7 +149,7 @@ void test_graph_iter(void) TEST_ASSERT_TRUE(graph->add_edge(graph, &data[7], &data[6], 87)); TEST_ASSERT_TRUE(graph->add_edge(graph, &data[8], &data[2], 92)); TEST_ASSERT_FALSE(graph->add_edge(graph, &temp, &data[1], 0)); - graph->print(graph); + // graph->print(graph); iterator_t iter_vertex = NULL; @@ -158,18 +158,18 @@ void test_graph_iter(void) while(iter_vertex->hasnext(iter_vertex)) { temp = *(int *)iter_vertex->next(iter_vertex); - graph->print_obj(&temp); + //graph->print_obj(&temp); } - printf("\n"); + //printf("\n"); iter_vertex = graph->iter(graph, GRAPH_DFS, &data[0]); TEST_ASSERT_NOT_NULL(iter_vertex); while(iter_vertex->hasnext(iter_vertex)) { temp = *(int *)iter_vertex->next(iter_vertex); - graph->print_obj(&temp); + //graph->print_obj(&temp); } - printf("\n"); + //printf("\n"); graph_free(&graph); TEST_ASSERT_NULL(graph);