From f58873baaa149b2c86ffd334ebafe3550462d7c9 Mon Sep 17 00:00:00 2001 From: wjf-hs Date: Wed, 3 Jul 2024 14:23:04 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9deque=EF=BC=8C=E5=B0=86?= =?UTF-8?q?=E5=A4=B4=E8=8A=82=E7=82=B9=E5=92=8C=E5=B0=BE=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E6=8B=86=E5=BC=80=E3=80=82=E6=96=B9=E4=BE=BF=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=90=86=E8=A7=A3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/deque.h | 3 +- src/deque.c | 77 ++++++++++++++++++++----------------------------- test/test.c | 5 ++-- 3 files changed, 35 insertions(+), 50 deletions(-) diff --git a/include/deque.h b/include/deque.h index bcbb6f0..d12d0bb 100644 --- a/include/deque.h +++ b/include/deque.h @@ -22,7 +22,8 @@ struct _deque_node struct _deque { - struct _deque_node* _head; // _head->prev指向头节点、_head->next指向尾节点 + struct _deque_node* _head; // 头节点 + struct _deque_node* _tail; // 尾节点 uint32_t _obj_size; // 元素大小 uint32_t _size; // 栈大小 diff --git a/src/deque.c b/src/deque.c index 0d5cb22..396d1c0 100644 --- a/src/deque.c +++ b/src/deque.c @@ -13,7 +13,6 @@ bool deque_push_back(struct _deque* self, void* obj) { assert(self != NULL); - assert(self->_head != NULL); struct _deque_node* front = NULL; struct _deque_node* back = NULL; @@ -37,19 +36,19 @@ bool deque_push_back(struct _deque* self, void* obj) if(self->empty(self)) { // if this is first node - self->_head->next = new_node; - self->_head->prev = new_node; + self->_tail = new_node; + self->_head = new_node; } - new_node->prev = self->_head->next; // step 1 - new_node->next = self->_head->prev; // step 2 + new_node->prev = self->_tail; // step 1 + new_node->next = self->_head; // step 2 - back = self->_head->next; + back = self->_tail; back->next = new_node; // step 3 - front = self->_head->prev; + front = self->_head; front->prev = new_node; // step 4 - self->_head->next = new_node; // step 5 + self->_tail = new_node; // step 5 self->_size += 1; return true; @@ -58,7 +57,6 @@ bool deque_push_back(struct _deque* self, void* obj) bool deque_push_front(struct _deque* self, void* obj) { assert(self != NULL); - assert(self->_head != NULL); struct _deque_node* front = NULL; struct _deque_node* back = NULL; @@ -82,19 +80,19 @@ bool deque_push_front(struct _deque* self, void* obj) if (self->empty(self)) { // if this is first node - self->_head->next = new_node; - self->_head->prev = new_node; + self->_tail = new_node; + self->_head = new_node; } - new_node->prev = self->_head->next; // step 1 - new_node->next = self->_head->prev; // step 2 + new_node->prev = self->_tail; // step 1 + new_node->next = self->_head; // step 2 - back = self->_head->next; + back = self->_tail; back->next = new_node; // step 3 - front = self->_head->prev; + front = self->_head; front->prev = new_node; // step 4 - self->_head->prev = new_node; // step 5 + self->_head = new_node; // step 5 self->_size += 1; return true; @@ -103,7 +101,6 @@ bool deque_push_front(struct _deque* self, void* obj) bool deque_pop_back(struct _deque* self, void* obj) { assert(self != NULL); - assert(self->_head != NULL); struct _deque_node* node = NULL; struct _deque_node* front = NULL; @@ -112,7 +109,7 @@ bool deque_pop_back(struct _deque* self, void* obj) return false; } - node = self->_head->next; + node = self->_tail; if (obj != NULL) { memmove(obj, node->obj, self->_obj_size); @@ -120,14 +117,14 @@ bool deque_pop_back(struct _deque* self, void* obj) if (self->size(self) == 1) { - self->_head->next = NULL; - self->_head->prev = NULL; + self->_tail = NULL; + self->_head = NULL; } else { - self->_head->next = node->prev; // step 1 + self->_tail = node->prev; // step 1 - front = self->_head->prev; + front = self->_head; front->prev = node->prev; // step 2 } @@ -141,7 +138,6 @@ bool deque_pop_back(struct _deque* self, void* obj) bool deque_pop_front(struct _deque* self, void* obj) { assert(self != NULL); - assert(self->_head != NULL); struct _deque_node* node = NULL; struct _deque_node* back = NULL; @@ -150,7 +146,7 @@ bool deque_pop_front(struct _deque* self, void* obj) return false; } - node = self->_head->prev; + node = self->_head; if (obj != NULL) { memmove(obj, node->obj, self->_obj_size); @@ -158,14 +154,14 @@ bool deque_pop_front(struct _deque* self, void* obj) if (self->size(self) == 1) { - self->_head->next = NULL; - self->_head->prev = NULL; + self->_tail = NULL; + self->_head = NULL; } else { - self->_head->prev = node->next; // step 1 + self->_head = node->next; // step 1 - back = self->_head->next; + back = self->_tail; back->next = node->next; // step 2 } @@ -179,28 +175,26 @@ bool deque_pop_front(struct _deque* self, void* obj) bool deque_back(struct _deque* self, void* obj) { assert(self != NULL); - assert(self->_head != NULL); assert(obj != NULL); if (self->empty(self)) { return false; } - memmove(obj, self->_head->next->obj, self->_obj_size); + memmove(obj, self->_tail->obj, self->_obj_size); return true; } bool deque_front(struct _deque* self, void* obj) { assert(self != NULL); - assert(self->_head != NULL); assert(obj != NULL); if (self->empty(self)) { return false; } - memmove(obj, self->_head->prev->obj, self->_obj_size); + memmove(obj, self->_head->obj, self->_obj_size); return true; } @@ -235,11 +229,10 @@ bool deque_clear(struct _deque* self) bool deque_get(struct _deque* self, int index, void* obj) { assert(self != NULL); - assert(self->_head != NULL); assert(obj != NULL); assert(index >= 0 && index < self->size(self)); - struct _deque_node* node = self->_head->prev; // front + struct _deque_node* node = self->_head; // front for (int i = 0; i < index; i++) { @@ -252,11 +245,10 @@ bool deque_get(struct _deque* self, int index, void* obj) bool deque_set(struct _deque* self, int index, void* obj) { assert(self != NULL); - assert(self->_head != NULL); assert(obj != NULL); assert(index >= 0 && index < self->size(self)); - struct _deque_node* node = self->_head->prev; // front + struct _deque_node* node = self->_head; // front for (int i = 0; i < index; i++) { @@ -292,10 +284,9 @@ void deque_destory(struct _deque* self) void deque_print(struct _deque* self) { assert(self != NULL); - assert(self->_head != NULL); uint32_t i = 0; - struct _deque_node * node = self->_head->prev; + struct _deque_node * node = self->_head; for (uint32_t i = 0; i < self->size(self); i++) { self->print_obj(node->obj); @@ -330,14 +321,8 @@ bool deque_init(struct _deque* self, uint32_t obj_size) self->set = deque_set; self->size = deque_size; - self->_head = (struct _deque_node*)malloc(sizeof(struct _deque_node)); - if (self->_head == NULL) - { - return false; - } - self->_head->obj = NULL; - self->_head->prev = NULL; - self->_head->next = NULL; + self->_head = NULL; + self->_tail = NULL; return true; } diff --git a/test/test.c b/test/test.c index 274c408..095eb3f 100644 --- a/test/test.c +++ b/test/test.c @@ -51,10 +51,9 @@ int main() { // test_list(); // test_stack(); - // test_deque(); + test_deque(); // test_queue(); - test_tree(); - + // test_tree(); } return 0; }