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