修改deque,将头节点和尾节点拆开。方便代码理解。

This commit is contained in:
建峰 2024-07-03 14:23:04 +08:00
parent 7715825de9
commit f58873baaa
3 changed files with 35 additions and 50 deletions

View File

@ -22,7 +22,8 @@ struct _deque_node
struct _deque struct _deque
{ {
struct _deque_node* _head; // _head->prev指向头节点、_head->next指向尾节点 struct _deque_node* _head; // 头节点
struct _deque_node* _tail; // 尾节点
uint32_t _obj_size; // 元素大小 uint32_t _obj_size; // 元素大小
uint32_t _size; // 栈大小 uint32_t _size; // 栈大小

View File

@ -13,7 +13,6 @@
bool deque_push_back(struct _deque* self, void* obj) bool deque_push_back(struct _deque* self, void* obj)
{ {
assert(self != NULL); assert(self != NULL);
assert(self->_head != NULL);
struct _deque_node* front = NULL; struct _deque_node* front = NULL;
struct _deque_node* back = NULL; struct _deque_node* back = NULL;
@ -37,19 +36,19 @@ bool deque_push_back(struct _deque* self, void* obj)
if(self->empty(self)) if(self->empty(self))
{ {
// if this is first node // if this is first node
self->_head->next = new_node; self->_tail = new_node;
self->_head->prev = new_node; self->_head = new_node;
} }
new_node->prev = self->_head->next; // step 1 new_node->prev = self->_tail; // step 1
new_node->next = self->_head->prev; // step 2 new_node->next = self->_head; // step 2
back = self->_head->next; back = self->_tail;
back->next = new_node; // step 3 back->next = new_node; // step 3
front = self->_head->prev; front = self->_head;
front->prev = new_node; // step 4 front->prev = new_node; // step 4
self->_head->next = new_node; // step 5 self->_tail = new_node; // step 5
self->_size += 1; self->_size += 1;
return true; return true;
@ -58,7 +57,6 @@ bool deque_push_back(struct _deque* self, void* obj)
bool deque_push_front(struct _deque* self, void* obj) bool deque_push_front(struct _deque* self, void* obj)
{ {
assert(self != NULL); assert(self != NULL);
assert(self->_head != NULL);
struct _deque_node* front = NULL; struct _deque_node* front = NULL;
struct _deque_node* back = NULL; struct _deque_node* back = NULL;
@ -82,19 +80,19 @@ bool deque_push_front(struct _deque* self, void* obj)
if (self->empty(self)) if (self->empty(self))
{ {
// if this is first node // if this is first node
self->_head->next = new_node; self->_tail = new_node;
self->_head->prev = new_node; self->_head = new_node;
} }
new_node->prev = self->_head->next; // step 1 new_node->prev = self->_tail; // step 1
new_node->next = self->_head->prev; // step 2 new_node->next = self->_head; // step 2
back = self->_head->next; back = self->_tail;
back->next = new_node; // step 3 back->next = new_node; // step 3
front = self->_head->prev; front = self->_head;
front->prev = new_node; // step 4 front->prev = new_node; // step 4
self->_head->prev = new_node; // step 5 self->_head = new_node; // step 5
self->_size += 1; self->_size += 1;
return true; return true;
@ -103,7 +101,6 @@ bool deque_push_front(struct _deque* self, void* obj)
bool deque_pop_back(struct _deque* self, void* obj) bool deque_pop_back(struct _deque* self, void* obj)
{ {
assert(self != NULL); assert(self != NULL);
assert(self->_head != NULL);
struct _deque_node* node = NULL; struct _deque_node* node = NULL;
struct _deque_node* front = NULL; struct _deque_node* front = NULL;
@ -112,7 +109,7 @@ bool deque_pop_back(struct _deque* self, void* obj)
return false; return false;
} }
node = self->_head->next; node = self->_tail;
if (obj != NULL) if (obj != NULL)
{ {
memmove(obj, node->obj, self->_obj_size); 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) if (self->size(self) == 1)
{ {
self->_head->next = NULL; self->_tail = NULL;
self->_head->prev = NULL; self->_head = NULL;
} }
else 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 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) bool deque_pop_front(struct _deque* self, void* obj)
{ {
assert(self != NULL); assert(self != NULL);
assert(self->_head != NULL);
struct _deque_node* node = NULL; struct _deque_node* node = NULL;
struct _deque_node* back = NULL; struct _deque_node* back = NULL;
@ -150,7 +146,7 @@ bool deque_pop_front(struct _deque* self, void* obj)
return false; return false;
} }
node = self->_head->prev; node = self->_head;
if (obj != NULL) if (obj != NULL)
{ {
memmove(obj, node->obj, self->_obj_size); 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) if (self->size(self) == 1)
{ {
self->_head->next = NULL; self->_tail = NULL;
self->_head->prev = NULL; self->_head = NULL;
} }
else 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 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) bool deque_back(struct _deque* self, void* obj)
{ {
assert(self != NULL); assert(self != NULL);
assert(self->_head != NULL);
assert(obj != NULL); assert(obj != NULL);
if (self->empty(self)) if (self->empty(self))
{ {
return false; return false;
} }
memmove(obj, self->_head->next->obj, self->_obj_size); memmove(obj, self->_tail->obj, self->_obj_size);
return true; return true;
} }
bool deque_front(struct _deque* self, void* obj) bool deque_front(struct _deque* self, void* obj)
{ {
assert(self != NULL); assert(self != NULL);
assert(self->_head != NULL);
assert(obj != NULL); assert(obj != NULL);
if (self->empty(self)) if (self->empty(self))
{ {
return false; return false;
} }
memmove(obj, self->_head->prev->obj, self->_obj_size); memmove(obj, self->_head->obj, self->_obj_size);
return true; return true;
} }
@ -235,11 +229,10 @@ bool deque_clear(struct _deque* self)
bool deque_get(struct _deque* self, int index, void* obj) bool deque_get(struct _deque* self, int index, void* obj)
{ {
assert(self != NULL); assert(self != NULL);
assert(self->_head != NULL);
assert(obj != NULL); assert(obj != NULL);
assert(index >= 0 && index < self->size(self)); 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++) 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) bool deque_set(struct _deque* self, int index, void* obj)
{ {
assert(self != NULL); assert(self != NULL);
assert(self->_head != NULL);
assert(obj != NULL); assert(obj != NULL);
assert(index >= 0 && index < self->size(self)); 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++) for (int i = 0; i < index; i++)
{ {
@ -292,10 +284,9 @@ void deque_destory(struct _deque* self)
void deque_print(struct _deque* self) void deque_print(struct _deque* self)
{ {
assert(self != NULL); assert(self != NULL);
assert(self->_head != NULL);
uint32_t i = 0; 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++) for (uint32_t i = 0; i < self->size(self); i++)
{ {
self->print_obj(node->obj); self->print_obj(node->obj);
@ -330,14 +321,8 @@ bool deque_init(struct _deque* self, uint32_t obj_size)
self->set = deque_set; self->set = deque_set;
self->size = deque_size; self->size = deque_size;
self->_head = (struct _deque_node*)malloc(sizeof(struct _deque_node)); self->_head = NULL;
if (self->_head == NULL) self->_tail = NULL;
{
return false;
}
self->_head->obj = NULL;
self->_head->prev = NULL;
self->_head->next = NULL;
return true; return true;
} }

View File

@ -51,10 +51,9 @@ int main()
{ {
// test_list(); // test_list();
// test_stack(); // test_stack();
// test_deque(); test_deque();
// test_queue(); // test_queue();
test_tree(); // test_tree();
} }
return 0; return 0;
} }