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; }
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; }