get和set方法实现

This commit is contained in:
建峰 2024-06-21 13:57:51 +08:00
parent a00a0342eb
commit ce3fa80cc5
2 changed files with 171 additions and 7 deletions

View File

@ -48,28 +48,67 @@ 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->_head != NULL);
struct _deque_node* front = NULL;
struct _deque_node* back = NULL;
// create a new object
void* new_obj = (void*)malloc(self->_obj_size);
if (new_obj == NULL)
{
return false;
}
memmove(new_obj, obj, self->_obj_size);
// create a new node
struct _deque_node* new_node = (struct _deque_node*)malloc(sizeof(struct _deque_node));
if (new_node == NULL)
{
return false;
}
new_node->obj = new_obj;
// link node
if (self->empty(self))
{
// if this is first node
self->_head->next = new_node;
self->_head->prev = new_node;
}
new_node->prev = self->_head->next; // step 1
new_node->next = self->_head->prev; // step 2
back = self->_head->next;
back->next = new_node; // step 3
front = self->_head->prev;
front->prev = new_node; // step 4
self->_head->prev = new_node; // step 5
self->_size += 1;
return true;
} }
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); assert(self->_head != NULL);
struct _deque_node* front = NULL;
struct _deque_node* back = NULL;
struct _deque_node* node = NULL; struct _deque_node* node = NULL;
struct _deque_node* front = NULL;
if (self->empty(self)) if (self->empty(self))
{ {
return false; return false;
} }
node = self->_head->next;
if (obj != NULL) if (obj != NULL)
{ {
memmove(obj, self->_head->next->obj, self->_obj_size); memmove(obj, node->obj, self->_obj_size);
} }
node = self->_head->next;
if (self->size(self) == 1) if (self->size(self) == 1)
{ {
self->_head->next = NULL; self->_head->next = NULL;
@ -92,7 +131,40 @@ 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->_head != NULL);
struct _deque_node* node = NULL;
struct _deque_node* back = NULL;
if (self->empty(self))
{
return false;
}
node = self->_head->prev;
if (obj != NULL)
{
memmove(obj, node->obj, self->_obj_size);
}
if (self->size(self) == 1)
{
self->_head->next = NULL;
self->_head->prev = NULL;
}
else
{
self->_head->prev = node->next; // step 1
back = self->_head->next;
back->next = node->next; // step 2
}
free(node->obj);
free(node);
self->_size -= 1;
return true;
} }
bool deque_back(struct _deque* self, void* obj) bool deque_back(struct _deque* self, void* obj)
@ -125,11 +197,11 @@ bool deque_front(struct _deque* self, void* obj)
bool deque_insert(struct _deque* self, int index, void* obj) bool deque_insert(struct _deque* self, int index, void* obj)
{ {
return true;
} }
bool deque_erase(struct _deque* self, int index, void* obj) bool deque_erase(struct _deque* self, int index, void* obj)
{ {
return true;
} }
int deque_index(struct _deque* self, void* obj) int deque_index(struct _deque* self, void* obj)
@ -156,6 +228,8 @@ bool deque_get(struct _deque* self, int index, void* obj)
assert(self != NULL); assert(self != NULL);
assert(self->_head != NULL); assert(self->_head != NULL);
assert(obj != 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->prev; // front
for (int i = 0; i < index; i++) for (int i = 0; i < index; i++)
@ -171,6 +245,8 @@ bool deque_set(struct _deque* self, int index, void* obj)
assert(self != NULL); assert(self != NULL);
assert(self->_head != NULL); assert(self->_head != NULL);
assert(obj != 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->prev; // front
for (int i = 0; i < index; i++) for (int i = 0; i < index; i++)
@ -237,7 +313,7 @@ bool deque_init(struct _deque* deque, uint32_t obj_size)
deque->index = deque_index; deque->index = deque_index;
deque->insert = deque_insert; deque->insert = deque_insert;
deque->pop_back = deque_pop_back; deque->pop_back = deque_pop_back;
deque->pop_front = deque_pop_back; deque->pop_front = deque_pop_front;
deque->push_back = deque_push_back; deque->push_back = deque_push_back;
deque->push_front = deque_push_front; deque->push_front = deque_push_front;
deque->print = deque_print; deque->print = deque_print;

View File

@ -83,6 +83,94 @@ static void deque_test_num(void)
} }
} }
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");
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");
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); dq.destory(&dq);
} }