From f0e9927f32731b1f96d6981fc169429a90437f97 Mon Sep 17 00:00:00 2001 From: cdez Date: Tue, 24 Oct 2023 23:37:26 -0700 Subject: [PATCH] Completed all but Two Remove Functions. +- BST_Utility.c ++ PA07_Main --- PA07-1025/BST_Utility.c | 295 +++++++++++++++++++++++++++++++++++----- PA07-1025/PA07_Main | Bin 0 -> 32920 bytes 2 files changed, 259 insertions(+), 36 deletions(-) create mode 100755 PA07-1025/PA07_Main diff --git a/PA07-1025/BST_Utility.c b/PA07-1025/BST_Utility.c index 31cf941..c883544 100644 --- a/PA07-1025/BST_Utility.c +++ b/PA07-1025/BST_Utility.c @@ -1,3 +1,4 @@ +// header files #include "BST_Utility.h" /* Data Structures @@ -27,9 +28,21 @@ Dependencies: free, clearTree (recursively) */ StateDataType *clearTree( StateDataType *wkgPtr ) { - // return NULL (temp) + // recurse through the left children + if(wkgPtr->leftChildPtr != NULL) + { + clearTree(wkgPtr->leftChildPtr); + } + // recurse through the right children + if(wkgPtr->rightChildPtr != NULL) + { + clearTree(wkgPtr->rightChildPtr); + } + // otherwise, free the working pointer if at end of getting to bottom tree + free(wkgPtr); + // return NULL since no tree left return NULL; -} +} //DONE /* Name: privateCompareStrings @@ -50,9 +63,21 @@ Dependencies: privateGetStringLen */ int privateCompareStrings( const char *leftStr, const char *rightStr ) { - // return 0 (temp) - return 0; -} + int diff, index = 0; + int leftStrLen = privateGetStringLen(leftStr); + int rightStrLen = privateGetStringLen(rightStr); + + while(index < leftStrLen && index < rightStrLen) + { + diff = leftStr[index] - rightStr[index]; + if(diff != 0) + { + return diff; + } + index = index + 1; + } + return leftStrLen - rightStrLen; +} //DONE /* Name: privateCopyString @@ -67,8 +92,19 @@ Dependencies: none */ void privateCopyString( char *dest, const char *source ) { + int characterCount = 0; + // use a while loop, check for !NULL_CHAR + while(source[characterCount] != NULL_CHAR) + { + // copy the character accessed into dest string + dest[characterCount] = source[characterCount]; + // iterate the number of characters + characterCount = characterCount + 1; + } + // add a NULL_CHAR once done, characterCount is in the right place for \0 + dest[characterCount] = NULL_CHAR; // no return, void -} +} //DONE /* Name: copyTree @@ -83,9 +119,21 @@ Dependencies: initializeStateNodeFromNode, copyTree (recursively) */ StateDataType *copyTree( StateDataType *wkgPtr ) { - // return NULL (temp) - return NULL; -} + // make a storage pointer + StateDataType *copyPtr = NULL; + // check for not equal to null + if(wkgPtr != NULL) + { + // create the pointer given data + copyPtr = initializeStateNodeFromNode(*wkgPtr); + // recurse left child + copyPtr->leftChildPtr = copyTree(wkgPtr->leftChildPtr); + // recurse right child + copyPtr->rightChildPtr = copyTree(wkgPtr->rightChildPtr); + } + // return copyPtr + return copyPtr; +}//DONE /* Name: displayInOrder @@ -99,8 +147,23 @@ Dependencies: stateDataToString, printf */ void displayInOrder( StateDataType *sdtPtr, int *itemNum ) { + // create empty string + char displayString[STD_STR_LEN]; + if(sdtPtr != NULL) + { + // recurse to left node in tree + displayInOrder(sdtPtr->leftChildPtr, itemNum); + // increment the item + *itemNum = *itemNum + 1; + // setup the string + stateDataToString(*sdtPtr, displayString); + // print out the string + printf("%2d) %s", *itemNum, displayString); + // recurse to right node in tree + displayInOrder(sdtPtr->rightChildPtr, itemNum); + } // no return, void -} +} //DONE /* Name: displayPostOrder @@ -114,8 +177,23 @@ Dependencies: stateDataToString, printf */ void displayPostOrder( StateDataType *sdtPtr, int *itemNum ) { + // create empty string + char displayString[STD_STR_LEN]; + if(sdtPtr != NULL) + { + // recurse to left node in tree + displayPostOrder(sdtPtr->leftChildPtr, itemNum); + // recurse to right node in tree + displayPostOrder(sdtPtr->rightChildPtr, itemNum); + // increment the item + *itemNum = *itemNum + 1; + // setup the string + stateDataToString(*sdtPtr, displayString); + // print out the string + printf("%2d) %s", *itemNum, displayString); + } // no return, void -} +} //DONE /* Name: displayPreOrder @@ -129,8 +207,23 @@ Dependencies: stateDataToString, printf */ void displayPreOrder( StateDataType *sdtPtr, int *itemNum ) { + // create empty string + char displayString[STD_STR_LEN]; + if(sdtPtr != NULL) + { + // increment the item + *itemNum = *itemNum + 1; + // setup the string + stateDataToString(*sdtPtr, displayString); + // print out the string + printf("%2d) %s", *itemNum, displayString); + // recurse to left node in tree + displayPostOrder(sdtPtr->leftChildPtr, itemNum); + // recurse to right node in tree + displayPostOrder(sdtPtr->rightChildPtr, itemNum); + } // no return, void -} +} //DONE /* Name: privateGetStringLen @@ -144,9 +237,16 @@ Dependencies: none */ int privateGetStringLen( const char *str ) { - // return 0 (temp) - return 0; -} + int strLen = 0; + // while through string until hit null. + while(str[strLen] != NULL_CHAR) + { + // increment the length string iterator + strLen = strLen + 1; + } + // return strLen + return strLen; +} //DONE /* Name: initializeBST @@ -161,8 +261,10 @@ Dependencies: none */ void initializeBST( StateDataType **bstPtr ) { + // initialize the address of the BST to null + *bstPtr = NULL; // no return, void -} +} //DONE /* Name: initializeStateNodeFromData @@ -181,9 +283,19 @@ Dependencies: malloc, sizeof, privateCopyString StateDataType *initializeStateNodeFromData( const char *state, double avgTemp, double lowTemp, double highTemp ) { - // return NULL (temp) - return NULL; -} + // declare node + StateDataType *initNode; + // create the node using malloc + initNode = malloc(sizeof(StateDataType)); + // copy the state into the node + privateCopyString(initNode->state, state); + // copy the avgTemp, lowTemp, and highTemp into node + initNode->avgTemp = avgTemp; + initNode->lowestTemp = lowTemp; + initNode->highestTemp = highTemp; + // return the node + return initNode; +} //DONE /* Name: initializeStateNodeFromNode @@ -199,9 +311,10 @@ Notes: one line of code */ StateDataType *initializeStateNodeFromNode( const StateDataType source ) { - // return NULL (temp) - return NULL; -} + // return the initializeStateNodeFromData function with correct data + return initializeStateNodeFromData(source.state, source.avgTemp, + source.lowestTemp, source.highestTemp); +} //DONE /* Name: insert @@ -220,9 +333,44 @@ Notes: No redundant code permitted */ StateDataType *insert( StateDataType *wkgPtr, const StateDataType inData ) { - // return NULL (temp) - return NULL; -} + // define space for node + StateDataType *insertNode; + int stringComparator; + // check to see if the working pointer is not null + if(wkgPtr != NULL) + { + // set string comparator + stringComparator = privateCompareStrings(inData.state, wkgPtr->state); + // compare the value less than + if(stringComparator < 0) + { + // workingPtr -> nextPtr = insert(workingPtr->nextPtr, data); + wkgPtr->leftChildPtr = insert(wkgPtr->leftChildPtr, inData); + } + // compare the value greater than + if(stringComparator > 0) + { + // workingPtr -> nextPtr = insert(workingPtr->nextPtr, data); + wkgPtr->rightChildPtr = insert(wkgPtr->rightChildPtr, inData); + } + // compare the value equal to + if(stringComparator == 0) + { + // replaces the data (using setStateNodeData?) + setStateNodeData(wkgPtr, inData); + } + } + // otherwise, create node + else + { + // create the node using function + insertNode = initializeStateNodeFromNode(inData); + // return created node + return insertNode; + } + // return working pointer to prev recursion + return wkgPtr; +} //DONE /* Name: isEmpty @@ -236,8 +384,9 @@ Dependencies: none */ bool isEmpty( StateDataType *sdtPtr) { - // return false (temp) -} + // return check for rootNode being NULL + return sdtPtr == NULL; +} //DONE /* Name: removeFromMin @@ -253,9 +402,20 @@ Dependencies: removeFromMin (recursively) StateDataType *removeFromMin( StateDataType *parentPtr, StateDataType *childPtr ) { - // return NULL (temp) - return NULL; -} + // check to see if the left child pointer is null + if(childPtr->leftChildPtr != NULL) + { + // keep going left until end + childPtr->leftChildPtr = removeFromMin(childPtr, childPtr->leftChildPtr); + } + else + { + // once found, delink between the parent and child + parentPtr->leftChildPtr = childPtr->rightChildPtr; + } + // return removed ptr + return childPtr; +} //DONE /* Name: removeItem @@ -319,9 +479,43 @@ Notes: No redundant code permitted */ StateDataType *search( StateDataType *wkgPtr, const StateDataType searchData ) { - // return NULL (temp) - return NULL; -} + // define space for node + StateDataType *searchNode; + int stringComparator; + // check to see if the working pointer is not null + if(wkgPtr != NULL) + { + // set string comparator + stringComparator = privateCompareStrings(searchData.state, wkgPtr->state); + // compare the value less than + if(stringComparator < 0) + { + // workingPtr -> nextPtr = search(workingPtr->nextPtr, data); + wkgPtr->leftChildPtr = search(wkgPtr->leftChildPtr, searchData); + } + // compare the value greater than + if(stringComparator > 0) + { + // workingPtr -> nextPtr = search(workingPtr->nextPtr, data); + wkgPtr->rightChildPtr = search(wkgPtr->rightChildPtr, searchData); + } + // compare the value equal to + if(stringComparator == 0) + { + searchNode = wkgPtr; + // returns the data, finishes find. + return searchNode; + } + } + // otherwise, the data was not found, and must fail. + else + { + // return NULL + return NULL; + } + // return working pointer to prev recursion + return wkgPtr; +} //DONE /* Name: setStateNodeToEmpty @@ -335,8 +529,19 @@ Dependencies: none */ void setStateNodeToEmpty( StateDataType *node ) { + // set the state to null character + node->state[0] = '\0'; + // set the average temp to 0 + node->avgTemp = 0; + // set the lowest temp to 0 + node->lowestTemp = 0; + // set the highest temp to 0 + node->highestTemp = 0; + // (not sure if messing with pointers) + node->leftChildPtr = NULL; + node->rightChildPtr = NULL; // no return, void -} +} //DONE /* Name: setStateNodeData @@ -350,8 +555,19 @@ Dependencies: copyString */ void setStateNodeData( StateDataType *destPtr, const StateDataType source ) { + // copy the state from source to dest with privateCopyString + privateCopyString(destPtr->state, source.state); + // copy the average temp from source to dest + destPtr->avgTemp = source.avgTemp; + // copy the lowest temp from source to dest + destPtr->lowestTemp = source.lowestTemp; + // copy the highest temp from source to dest + destPtr->highestTemp = source.highestTemp; + // (not sure if messing with pointers) + // destPtr->leftChildPtr = source.leftChildPtr; + // destPtr->rightChildPtr = source.rightChildPtr; // no return, void -} +} //DONE /* Name: stateDataToString @@ -365,5 +581,12 @@ Dependencies: sprintf */ void stateDataToString( StateDataType stateData, char str[] ) { + // use sprintf to load the state name into str + // use sprintf to load the average temp into str + // use sprintf to load the lowest temp into str + // use sprintf to load the highest temp into str + // this is done all at once to avoid many lines + sprintf(str, "%s/%0.2f/%0.2f/%0.2f\n", stateData.state, stateData.avgTemp, + stateData.lowestTemp, stateData.highestTemp); // no return, void -} \ No newline at end of file +} //DONE \ No newline at end of file diff --git a/PA07-1025/PA07_Main b/PA07-1025/PA07_Main new file mode 100755 index 0000000000000000000000000000000000000000..0d572624457961d8e88dee3dfb6055b8b8bf02a6 GIT binary patch literal 32920 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 W>Qy-EuBqfZ)=Q4_EdrLJ_J08~+aF>8 literal 0 HcmV?d00001