Beispiel #1
0
MySetResult mySetAdd(MySet set, MySetElement element) {
	if (set == NULL || element == NULL) {
		return MY_SET_NULL_ARGUMENT;
	}
	if (mySetIsIn(set, element)) {
		return MY_SET_ITEM_ALREADY_EXISTS;
	}

	// Create new node
	MySetNode node;
	MY_SET_ALLOCATION(MySetNode_t, node, MY_SET_OUT_OF_MEMORY);
	if (NULL == (node->element = set->copyElement(element))) {
		free(node);
		return MY_SET_OUT_OF_MEMORY;
	}

	if (set->head == NULL || set->compareElements(set->head->element, element) > 0) {
		//need to push front
		node->next = set->head;
		set->head = node;
	} else {
		assert(set->head != NULL);
		assert(set->compareElements(set->head->element, element) < 0);
		// find last position where element is lower then ours or last element
		MySetNode position;
		for (position = set->head;
				position->next != NULL &&
						set->compareElements(position->next->element, element) < 0;
				position = position->next);
		assert(position != NULL);
		assert(position->next == NULL || set->compareElements(position->next->element, element) > 0);
		// insert after position
		node->next = position->next;
		position->next = node;
	}
	return MY_SET_SUCCESS;
}