Implementing ex32 List copy, split, and join

This commit is contained in:
Dan Buch
2016-04-17 13:50:26 -04:00
parent 015288d5b6
commit c4b92572bf
3 changed files with 163 additions and 1 deletions

View File

@@ -129,7 +129,7 @@ void *List_remove(List *list, ListNode *node)
list->first->prev = NULL;
} else if(node == list->last) {
list->last = node->prev;
check(list->last != NULL, "INvalid list, somehow got a next that is NULL.");
check(list->last != NULL, "Invalid list, somehow got a next that is NULL.");
list->last->next = NULL;
} else {
ListNode *after = node->next;
@@ -145,3 +145,68 @@ void *List_remove(List *list, ListNode *node)
error:
return result;
}
List *List_copy(List *list)
{
List_validate(list);
List *out = List_create();
LIST_FOREACH(list, first, next, cur) {
List_push(out, cur->value);
}
return out;
}
int List_split(List *list, void *split, List *a, List *b)
{
List_validate(list);
check(list->first && list->last, "List is empty.");
check(split, "split can't be NULL");
if(split == list->last->value || (split == list->first->value && split == list->last->value)) {
(*a) = *List_copy(list);
return 0;
} else if(split == list->first->value) {
(*b) = *List_copy(list);
List_push(a, List_shift(b));
return 0;
} else {
int past_split = 0;
LIST_FOREACH(list, first, next, cur) {
if(past_split) {
List_push(b, cur->value);
continue;
}
if(cur->value == split) {
past_split = 1;
}
List_push(a, cur->value);
}
}
return 0;
error:
return -1;
}
void List_join(List *list, List *b)
{
List_validate(list);
List_validate(b);
List *tail = List_copy(b);
list->last->next = tail->first;
list->count += tail->count;
free(tail);
return;
}

View File

@@ -35,6 +35,10 @@ void *List_shift(List *list);
void *List_remove(List *list, ListNode *node);
List *List_copy(List *list);
int List_split(List *list, void *split, List *a, List *b);
void List_join(List *list, List *b);
#define List_validate(A) (assert(A != NULL && List_count(A) > -1 &&\
(List_count(A) > 0 && List_first(A) != NULL) && "invalid *List"))