mirror of
https://gitee.com/apaki/unicstl.git
synced 2025-05-18 03:51:35 +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)
|
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;
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user