diff --git a/containers/linked_list.c b/containers/linked_list.c index cc3d7d8..c66296c 100644 --- a/containers/linked_list.c +++ b/containers/linked_list.c @@ -259,7 +259,41 @@ int linked_list_insert_all_at(size_t index, void** item_p, size_t num_items, lin void* linked_list_remove(void *item, linked_list_t *linked_list_p) { - return NULL; + assert(linked_list_p && item); + + if(linked_list_p->mode == COLLECTION_MODE_SYNCHRONIZED) { + pthread_mutex_lock(&linked_list_p->lock); + } + + linked_list_item_t* list_item = linked_list_p->first; + + while(list_item != NULL && list_item->item != item) { + list_item = list_item->next; + } + + if (list_item) { + if (list_item != linked_list_p->first) + list_item->prev->next = list_item->next; + else{ + if(linked_list_p->first = list_item->next) + list_item->next->prev = NULL; + } + if (list_item != linked_list_p->last) + list_item->next->prev = list_item->prev; + else{ + if(linked_list_p->last = list_item->prev) + list_item->prev->next = NULL; + } + + linked_list_p->size--; + + linked_list_item_free(list_item, NULL); + } + + if(linked_list_p->mode == COLLECTION_MODE_SYNCHRONIZED) { + pthread_mutex_unlock(&linked_list_p->lock); + } + return item; } void* linked_list_remove_first(linked_list_t *linked_list_p) { @@ -278,6 +312,8 @@ void* linked_list_remove_first(linked_list_t *linked_list_p) { if (linked_list_p->first) { linked_list_p->first->prev = NULL; } + else + linked_list_p->last = NULL; //jj linked_list_p->size--; item = list_item->item; linked_list_item_free(list_item, NULL); @@ -308,6 +344,8 @@ void* linked_list_remove_last(linked_list_t *linked_list_p) { if (linked_list_p->last) { linked_list_p->last->next = NULL; } + else + linked_list_p->first = NULL; //jj linked_list_p->size--; item = list_item->item; linked_list_item_free(list_item, NULL); @@ -327,6 +365,11 @@ void* linked_list_remove_at(size_t index, linked_list_t *linked_list_p) { void *item = NULL; if(index >= 0 && index < linked_list_p->size) { + if(index == 0) //jj + return linked_list_remove_first(linked_list_p); + if(index == linked_list_p->size-1) + return linked_list_remove_last(linked_list_p); + if(linked_list_p->mode == COLLECTION_MODE_SYNCHRONIZED) { pthread_mutex_lock(&linked_list_p->lock); } diff --git a/containers/test/linked_list_test.c b/containers/test/linked_list_test.c index 8a2fb0d..7fa8c25 100644 --- a/containers/test/linked_list_test.c +++ b/containers/test/linked_list_test.c @@ -47,6 +47,10 @@ START_TEST(test_insert_and_remove) { fail_if((int) linked_list_get_last(list) != 5, "Get: Position #5 (last) must contain number 5"); fail_if((int) linked_list_remove_first(list) != 0, "Remove: Position #0 (first) must contain number 0"); + fail_if((int) linked_list_insert_first(NULL, list) != 1, "Insert: Position #0"); + fail_if((int) linked_list_remove_at(0, list) != 0, "Remove: Position #0 must contain number 0"); + fail_if((int) linked_list_insert_last(NULL, list) != 1, "Insert: Position last"); + fail_if((int) linked_list_remove_at(linked_list_size(list)-1, list) != 0, "Remove: Position size-1(last) must contain number 0"); fail_if((int) linked_list_remove_last(list) != 5, "Remove: Position #5 (last) must contain number 5"); fail_if((int) linked_list_remove_at(2, list) != 3, "Remove: Position #2 must contain number 3");