Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
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;
}
Beispiel #4
0
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;
}