From c3927befbcdf2060e80c23bb8ad47d6e39b0392a Mon Sep 17 00:00:00 2001 From: wjf-hs Date: Fri, 21 Jun 2024 15:27:18 +0800 Subject: [PATCH] =?UTF-8?q?deque=E5=85=88=E8=BF=99=E6=A0=B7=EF=BC=8C?= =?UTF-8?q?=E5=90=8E=E7=BB=AD=E6=9C=89=E5=85=B6=E4=BB=96=E9=9C=80=E6=B1=82?= =?UTF-8?q?=E5=86=8D=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- datastruct/deque.h | 4 + datastruct/deque_test.c | 187 ++++++++++++++++++++++++++++++++++++++++ datastruct/queue.h | 3 + 3 files changed, 194 insertions(+) diff --git a/datastruct/deque.h b/datastruct/deque.h index 9d2460f..5913d39 100644 --- a/datastruct/deque.h +++ b/datastruct/deque.h @@ -46,6 +46,10 @@ struct _deque // free void (*destory)(struct _deque* self); + // compare + int (*cmp)(void* obj, void* obj2); + bool (*sort)(struct _list* self, uint8_t reserve); + // print void (*print)(struct _deque* self); void (*print_obj)(void* obj); diff --git a/datastruct/deque_test.c b/datastruct/deque_test.c index eae9261..65d94fe 100644 --- a/datastruct/deque_test.c +++ b/datastruct/deque_test.c @@ -174,7 +174,194 @@ static void deque_test_num(void) dq.destory(&dq); } +struct _student +{ + char name[16]; + int id; +}; + +static void print_struct(void* obj) +{ + struct _student* student = (struct _student*)obj; + printf("(%4d:%-8s) ", student->id, student->name); +} + +static void deque_test_struct(void) +{ + uint32_t i = 0; + struct _student data[] = { + "zhao", 1001, "qian", 1002, "sun", 1003, "li", 1004, + "zhou", 1005, "wu", 1006, "zheng", 1007, "wang", 1008, + "feng", 1009, "cheng",1010, + }; + struct _student temp = {0}; + uint32_t len = sizeof(data) / sizeof(data[0]); + + struct _deque dq; + deque_init(&dq, sizeof(struct _student)); + dq.print_obj = print_struct; + + printf("\n\n----- deque_test_struct -----\n"); + + printf("----- after push_back -----\n"); + for (i = 0; i < len; i++) + { + dq.push_back(&dq, &data[i]); + + dq.front(&dq, &temp); + printf("front = "); + dq.print_obj(&temp); + + dq.back(&dq, &temp); + printf("\tback = "); + dq.print_obj(&temp); + + printf("\tsize = %2d\n", dq.size(&dq)); + } + printf("----- print -----\n"); + dq.print(&dq); + printf("\n"); + + dq.clear(&dq); + if (dq.empty(&dq)) + { + printf("----- empty -----\n"); + } + + printf("----- push_back -----\n"); + for (i = 0; i < len; i++) + { + dq.push_back(&dq, &data[i]); + } + + printf("----- after pop_back -----\n"); + for (i = 0; i < len + 1; i++) + { + if (true == dq.pop_back(&dq, &temp)) + { + printf("pop = "); + dq.print_obj(&temp); + + if (true == dq.front(&dq, &temp)) + { + printf("front = "); + dq.print_obj(&temp); + } + + if (dq.back(&dq, &temp)) + { + printf("back = "); + dq.print_obj(&temp); + } + + printf("size = %2d\n", dq.size(&dq)); + } + else + { + printf("pop failed! because stack is empty\n"); + } + + if (dq.empty(&dq)) + { + printf("----- empty -----\n"); + } + } + + printf("----- after push_front -----\n"); + for (i = 0; i < len; i++) + { + dq.push_front(&dq, &data[i]); + + dq.front(&dq, &temp); + printf("front = "); + dq.print_obj(&temp); + + dq.back(&dq, &temp); + printf("\tback = "); + dq.print_obj(&temp); + + printf("\tsize = %2d\n", dq.size(&dq)); + } + printf("----- print -----\n"); + dq.print(&dq); + printf("\n"); + + dq.clear(&dq); + if (dq.empty(&dq)) + { + printf("----- empty -----\n"); + } + + printf("----- push_front -----\n"); + for (i = 0; i < len; i++) + { + dq.push_front(&dq, &data[i]); + } + + for (i = 0; i < len + 1; i++) + { + if (true == dq.pop_front(&dq, &temp)) + { + printf("pop = "); + dq.print_obj(&temp); + + if (true == dq.front(&dq, &temp)) + { + printf("front = "); + dq.print_obj(&temp); + } + + if (dq.back(&dq, &temp)) + { + printf("back = "); + dq.print_obj(&temp); + } + + printf("size = %2d\n", dq.size(&dq)); + } + } + + printf("----- push_front -----\n"); + for (i = 0; i < len; i++) + { + dq.push_front(&dq, &data[i]); + } + printf("----- print -----\n"); + dq.print(&dq); + printf("\n"); + +#if 0 + printf("----- set -----\n"); + temp = 11; + dq.set(&dq, 0, &temp); + + temp = 22; + dq.set(&dq, len / 2, &temp); + + temp = 33; + dq.set(&dq, len - 1, &temp); + + printf("----- print -----\n"); + dq.print(&dq); + printf("\n"); +#endif + + printf("----- get -----\n"); + for (i = 0; i < len; i++) + { + if (true == dq.get(&dq, i, &temp)) + { + printf("deque[%2d] = ", i); + dq.print_obj(&temp); + printf("\n"); + } + } + + dq.destory(&dq); +} + void deque_test(void) { deque_test_num(); + deque_test_struct(); } diff --git a/datastruct/queue.h b/datastruct/queue.h index 5a8cebe..c776f74 100644 --- a/datastruct/queue.h +++ b/datastruct/queue.h @@ -35,4 +35,7 @@ bool queue_get_rear(pqueue_t head, queue_data_t *data); #endif + + + #endif // _QUEUE_H_