inline List *List_merge(List *left, List *right, List_val_compare cmp) { check((left != NULL) || (right != NULL), "Tried to merge NULL."); List *merged = List_create(); void *val = NULL; while(List_count(left) > 0 || List_count(right) > 0) { if(List_count(left) > 0 && List_count(right) > 0) { if(cmp(List_first(left), List_first(right)) <= 0) { val = List_fpop(left); } else { val = List_fpop(right); } List_push(merged, val); } else if(List_count(left) > 0) { merged = List_join(merged, left); break; } else if(List_count(right) > 0) { merged = List_join(merged, right); break; } } return merged; error: return NULL; }
char *test_join() { mu_assert(List_count(list) == 4, "Wrong count before join."); List *b = List_create(); List_push(b, test4); mu_assert(List_count(b) == 1, "List 'b' has wrong count."); List_join(list, b); mu_assert(List_count(list) == 5, "Wrong count after join."); return NULL; }
inline List *List_merge(List *left, List *right, List_compare cmp) { List *result = List_create(); void *val = NULL; while(List_count(left) > 0 || List_count(right) > 0) { if(List_count(left) > 0 && List_count(right) > 0) { if(cmp(List_first(left), List_first(right)) <= 0) { val = List_shift(left); } else { val = List_shift(right); } List_push(result, val); } else if(List_count(left) > 0) { List_join(result, left); } else if(List_count(right) > 0) { List_join(result, right); } } return result; }
int List_join_test(List *list, List *right) { List *joined; size_t rightCount; size_t leftCount; leftCount = list->count; rightCount = right->count; joined = List_join(list, right); assert(joined); assert(joined == list); assert(list->count == leftCount + rightCount); List_foreach_test(list, "Printing out rejoined list"); return 0; }