예제 #1
0
파일: mtm_set.c 프로젝트: fisher6/Set
SetResult setRemove(Set set, SetElement element) {
	IF_NULL_RETURN_SET_NULL_ARGUMENT(set)
	IF_NULL_RETURN_SET_NULL_ARGUMENT(element)
	set->current = NULL; // iterator is undefined for every setRemove result
	Node iteratingNode = set->dummy->next;
	Node beforeNode = set->dummy;
	while (iteratingNode != NULL) {
		assert(iteratingNode->data != NULL);
		int cmpResult = set->cmpFunc(iteratingNode->data, element);
		if (cmpResult > 0) {
			return SET_ITEM_DOES_NOT_EXIST; // current element greater
		}
		if (cmpResult < 0) { // add element after iterating Node
			iteratingNode = iteratingNode->next;
			beforeNode = beforeNode->next;
			continue;
		}
		// cmpResult == 0 => delete the node
		beforeNode->next = iteratingNode->next;
		set->freeFunc(iteratingNode->data);
		free(iteratingNode);
		set->size--;
		return SET_SUCCESS;
	}
	return SET_ITEM_DOES_NOT_EXIST;
}
예제 #2
0
파일: mtm_set.c 프로젝트: fisher6/Set
SetResult setClear(Set set) {
	IF_NULL_RETURN_SET_NULL_ARGUMENT(set)
	IS_SET_VALID(set)
	Node nodeToDelete = set->dummy->next;
	while (nodeToDelete != NULL) {
		if (nodeToDelete->data != NULL) {
			set->freeFunc(nodeToDelete->data);
		}
		Node nextNode = nodeToDelete->next;
		free(nodeToDelete);
		nodeToDelete = nextNode;
	}
	set->dummy->next = NULL;
	set->current = NULL;
	set->size = 0;
	return SET_SUCCESS;
}