Beispiel #1
0
bool mySetIsIn(MySet set, MySetElement element) {
	if (set == NULL || element == NULL) {
		return false;
	}
	for (MySetNode iterator = set->head; iterator != NULL; iterator = iterator->next) {
		if (set->compareElements(iterator->element, element) == 0) {
			return true;
		}
	}

	return false;
}
Beispiel #2
0
MySetElement mySetExtract(MySet set, MySetElement element) {
	if (set == NULL || !mySetIsIn(set, element)) {
		return NULL;
	}

	assert(set->head != NULL);
	MySetElement result;
	MySetNode node; // node we want to deallocate
	if (set->compareElements(set->head->element, element) == 0) {
		// pop front
		result = set->head->element;
		node = set->head;
		// extracting
		set->head = set->head->next;
	} else {
		MySetNode position;
		for (position = set->head;
				position->next != NULL && set->compareElements(position->next->element, element) != 0;
				position = position->next);

		assert(position->next != NULL && set->compareElements(position->next->element, element) == 0);
		result = position->next->element;
		if (position->next->next == NULL) {
			node = position->next;
			// extracting
			position->next = NULL;
		} else {
			position = position->next;
			node = position->next;
			// extracting
			assert(position->next != NULL);
			position->element = position->next->element;
			position->next = position->next->next;
		}

	}
	free(node);
	return result;
}
Beispiel #3
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;
}