mirror of
https://gitee.com/apaki/unicstl.git
synced 2025-05-17 19:41:36 +08:00
get和set方法实现
This commit is contained in:
parent
a00a0342eb
commit
ce3fa80cc5
@ -48,28 +48,67 @@ 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;
|
||||
|
||||
// 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)
|
||||
{
|
||||
assert(self != NULL);
|
||||
assert(self->_head != NULL);
|
||||
struct _deque_node* front = NULL;
|
||||
struct _deque_node* back = NULL;
|
||||
struct _deque_node* node = NULL;
|
||||
struct _deque_node* front = NULL;
|
||||
|
||||
if (self->empty(self))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
node = self->_head->next;
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
@ -125,11 +197,11 @@ bool deque_front(struct _deque* self, void* obj)
|
||||
|
||||
bool deque_insert(struct _deque* self, int index, void* obj)
|
||||
{
|
||||
|
||||
return true;
|
||||
}
|
||||
bool deque_erase(struct _deque* self, int index, void* obj)
|
||||
{
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
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->_head != NULL);
|
||||
assert(obj != NULL);
|
||||
assert(index >= 0 && index < self->size(self));
|
||||
|
||||
struct _deque_node* node = self->_head->prev; // front
|
||||
|
||||
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->_head != NULL);
|
||||
assert(obj != NULL);
|
||||
assert(index >= 0 && index < self->size(self));
|
||||
|
||||
struct _deque_node* node = self->_head->prev; // front
|
||||
|
||||
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->insert = deque_insert;
|
||||
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_front = deque_push_front;
|
||||
deque->print = deque_print;
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user