From a3ec33a9179c3063db9421bc8308108c603b2b56 Mon Sep 17 00:00:00 2001 From: cdez Date: Wed, 25 Oct 2023 16:48:10 -0700 Subject: [PATCH] Mostly Completed PA07 +- BST_Utility.c +- PA07_Main --- PA07-1025/BST_Utility.c | 161 ++++++++++++++++++++++++++++------------ PA07-1025/PA07_Main | Bin 32920 -> 32920 bytes 2 files changed, 114 insertions(+), 47 deletions(-) diff --git a/PA07-1025/BST_Utility.c b/PA07-1025/BST_Utility.c index c883544..a1b1e2f 100644 --- a/PA07-1025/BST_Utility.c +++ b/PA07-1025/BST_Utility.c @@ -42,7 +42,7 @@ StateDataType *clearTree( StateDataType *wkgPtr ) free(wkgPtr); // return NULL since no tree left return NULL; -} //DONE +} /* Name: privateCompareStrings @@ -77,7 +77,7 @@ int privateCompareStrings( const char *leftStr, const char *rightStr ) index = index + 1; } return leftStrLen - rightStrLen; -} //DONE +} /* Name: privateCopyString @@ -104,7 +104,7 @@ void privateCopyString( char *dest, const char *source ) // add a NULL_CHAR once done, characterCount is in the right place for \0 dest[characterCount] = NULL_CHAR; // no return, void -} //DONE +} /* Name: copyTree @@ -133,7 +133,7 @@ StateDataType *copyTree( StateDataType *wkgPtr ) } // return copyPtr return copyPtr; -}//DONE +} /* Name: displayInOrder @@ -163,7 +163,7 @@ void displayInOrder( StateDataType *sdtPtr, int *itemNum ) displayInOrder(sdtPtr->rightChildPtr, itemNum); } // no return, void -} //DONE +} /* Name: displayPostOrder @@ -193,7 +193,7 @@ void displayPostOrder( StateDataType *sdtPtr, int *itemNum ) printf("%2d) %s", *itemNum, displayString); } // no return, void -} //DONE +} /* Name: displayPreOrder @@ -223,7 +223,7 @@ void displayPreOrder( StateDataType *sdtPtr, int *itemNum ) displayPostOrder(sdtPtr->rightChildPtr, itemNum); } // no return, void -} //DONE +} /* Name: privateGetStringLen @@ -246,7 +246,7 @@ int privateGetStringLen( const char *str ) } // return strLen return strLen; -} //DONE +} /* Name: initializeBST @@ -264,7 +264,7 @@ void initializeBST( StateDataType **bstPtr ) // initialize the address of the BST to null *bstPtr = NULL; // no return, void -} //DONE +} /* Name: initializeStateNodeFromData @@ -295,7 +295,7 @@ StateDataType *initializeStateNodeFromData( const char *state, double avgTemp, initNode->highestTemp = highTemp; // return the node return initNode; -} //DONE +} /* Name: initializeStateNodeFromNode @@ -314,7 +314,7 @@ StateDataType *initializeStateNodeFromNode( const StateDataType source ) // return the initializeStateNodeFromData function with correct data return initializeStateNodeFromData(source.state, source.avgTemp, source.lowestTemp, source.highestTemp); -} //DONE +} /* Name: insert @@ -370,7 +370,7 @@ StateDataType *insert( StateDataType *wkgPtr, const StateDataType inData ) } // return working pointer to prev recursion return wkgPtr; -} //DONE +} /* Name: isEmpty @@ -386,7 +386,7 @@ bool isEmpty( StateDataType *sdtPtr) { // return check for rootNode being NULL return sdtPtr == NULL; -} //DONE +} /* Name: removeFromMin @@ -415,7 +415,7 @@ StateDataType *removeFromMin( StateDataType *parentPtr, } // return removed ptr return childPtr; -} //DONE +} /* Name: removeItem @@ -435,7 +435,26 @@ Dependencies: search, initializeStateNodeFromNode, removeItemHelper bool removeItem( StateDataType **rootPtr, StateDataType *removedData, const StateDataType outData ) { - // return false (temp) + StateDataType *searchPtr; + // check to see if the BST is there + if(rootPtr != NULL) + { + // search for the data in the tree + searchPtr = search(*rootPtr, outData); + // check to see if data was found from search to remove + if(searchPtr != NULL) + { + // if found, set the search value to removedData + *removedData = *searchPtr; + // start the recursions down to the remove value + *rootPtr = removeItemHelper(*rootPtr, outData); + // return success with item removal + return true; + } + } + // set removeData to NULL since no value found + removedData = NULL; + // return false since no item found or tree empty/not found return false; } @@ -459,8 +478,67 @@ Notes: No redundant code permitted StateDataType *removeItemHelper( StateDataType *wkgPtr, const StateDataType outData ) { - // return NULL (temp) - return NULL; + // create, initialize result of compare strings + int stringComparator; + stringComparator = privateCompareStrings(outData.state, wkgPtr->state); + StateDataType *removalPtr; + + // check for moving to left + if(stringComparator < 0) + { + // - recurse to left, link to left child + wkgPtr->leftChildPtr = removeItemHelper(wkgPtr->leftChildPtr, outData); + } + // otherwise, check for moving to right + else if(stringComparator > 0) + { + // - recurse to right, link to right child + wkgPtr->rightChildPtr = removeItemHelper(wkgPtr->rightChildPtr, outData); + } + // otherwise, check for left child null + else if(wkgPtr->leftChildPtr == NULL) + { + // - set a temp pointer to the wkg pointer + removalPtr = wkgPtr; + // - set return pointer to its right child + wkgPtr = wkgPtr->rightChildPtr; + // - free temp pointer + free(removalPtr); + } + // otherwise, check for right child null + else if(wkgPtr->rightChildPtr == NULL) + { + // - set a temp pointer to the wkg pointer + removalPtr = wkgPtr; + // - set return pointer to its left child + wkgPtr = wkgPtr->rightChildPtr; + // - free temp pointer + free(removalPtr); + } + // otherwise, check for right child has no left child + else if(wkgPtr->rightChildPtr->leftChildPtr == NULL) + { + // - copy the data from the right child into the current node + setStateNodeData(wkgPtr, *wkgPtr->rightChildPtr); + // - set a temp pointer to the right child + removalPtr = wkgPtr->rightChildPtr; + // - link around the right child + wkgPtr->rightChildPtr = removalPtr->rightChildPtr; + // - free the right child node + free(removalPtr); + } + // otherwise // , assume right child has left child + else + { + // - call removeFromMin, capture the returned node, + removalPtr = removeFromMin(wkgPtr, wkgPtr->rightChildPtr); + // - set the current node from the captured node + setStateNodeData(wkgPtr, *removalPtr); + // - free the captured node (temp ptr) + free(removalPtr); + } + // recommend one return at the bottom of function, will give back wkgPtr + return wkgPtr; } /* @@ -479,43 +557,32 @@ Notes: No redundant code permitted */ StateDataType *search( StateDataType *wkgPtr, const StateDataType searchData ) { - // define space for node - StateDataType *searchNode; - int stringComparator; - // check to see if the working pointer is not null + // define the string comparison number + int stringComparator = privateCompareStrings(searchData.state, + wkgPtr->state); + // check to see if at the end of tree if(wkgPtr != NULL) { - // set string comparator - stringComparator = privateCompareStrings(searchData.state, wkgPtr->state); - // compare the value less than + // check the left side of the tree if(stringComparator < 0) { - // workingPtr -> nextPtr = search(workingPtr->nextPtr, data); - wkgPtr->leftChildPtr = search(wkgPtr->leftChildPtr, searchData); + return search(wkgPtr->leftChildPtr, searchData); } - // compare the value greater than - if(stringComparator > 0) + // check the right side of the tree + else if(stringComparator > 0) { - // workingPtr -> nextPtr = search(workingPtr->nextPtr, data); - wkgPtr->rightChildPtr = search(wkgPtr->rightChildPtr, searchData); + return search(wkgPtr->rightChildPtr, searchData); } - // compare the value equal to - if(stringComparator == 0) + // otherwise, data has been found + else { - searchNode = wkgPtr; - // returns the data, finishes find. - return searchNode; + // return the found value + return wkgPtr; } } - // otherwise, the data was not found, and must fail. - else - { - // return NULL - return NULL; - } - // return working pointer to prev recursion - return wkgPtr; -} //DONE + // otherwise, return null for not found + return NULL; +} /* Name: setStateNodeToEmpty @@ -541,7 +608,7 @@ void setStateNodeToEmpty( StateDataType *node ) node->leftChildPtr = NULL; node->rightChildPtr = NULL; // no return, void -} //DONE +} /* Name: setStateNodeData @@ -567,7 +634,7 @@ void setStateNodeData( StateDataType *destPtr, const StateDataType source ) // destPtr->leftChildPtr = source.leftChildPtr; // destPtr->rightChildPtr = source.rightChildPtr; // no return, void -} //DONE +} /* Name: stateDataToString @@ -589,4 +656,4 @@ void stateDataToString( StateDataType stateData, char str[] ) sprintf(str, "%s/%0.2f/%0.2f/%0.2f\n", stateData.state, stateData.avgTemp, stateData.lowestTemp, stateData.highestTemp); // no return, void -} //DONE \ No newline at end of file +} \ No newline at end of file diff --git a/PA07-1025/PA07_Main b/PA07-1025/PA07_Main index 0d572624457961d8e88dee3dfb6055b8b8bf02a6..8bc4ed90af1a5000ee8e1e8ff12fe630f14908cd 100755 GIT binary patch delta 5142 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 J{ZhY!{uctC^Wp#i delta 3723 zcmaKue^iuJ8prQk0Rd4EQDG251ZNmv21dYvF!9H5MnKQ5sY{vV4>TDOGqG4VBA2xs zejHby%|or_(QQqUJ!fk=EoGT#M^RC7Z43D!zXV1Y6SM7%F7531ec!8sf9(A8`Of#b z_qq4I@AKT5>YcoLC;z**%6E~L$)8193RLNR4opzK9Bq!Gd0N^su8;Lnq2UC7-@ z_op&ew(B`8p;AV?5kUFsSbi_SzF)nW^9f!w6gHXEVc+r@o{%5#5)a9-9}f@Xd{{*n zB0kNw*h*X$+x8(j!>TiP{lo7sx7d0m`*Ewx83Eg2DJyX>|34hVGgvCj4m_TvswBX% z@E!$4RH`Q{p4kPu2FJ-c20bK`yrZ}APhC_Jy*{WZ9FuLAEw*!YW2Cc~e%tM)L`_hz zqwWW{+h%s1GY?CLH0W1m9#%R2@&iTA9Oi$$MG>0SoSgJ~O)<}R(y%6N%HC0}Qt6Td52{BGzcfG=oz~;-&BuoCze!EH#Ehrm+swl_ zgJw(B(usf73LeU=3zYb;8HQ@_@hDFZ&F6=Z~Pa_j(EN%2OWvk z`v;8l_Bp60_9@+&;1TCwcA)&K%tP`!@;p8=^tpqw}XhvQ#X0`{4Y(ipXj0%C&uKJipT(mlUB2FP($L6`sYwhz>1t2Ebf7hpfp7ktP1p z+UFcQJFqQuo}`mUXxnxAB6$J-I-OK0iM;+gC8eZKyW2jpF)ZkBn`^h(iL9yVRGFgV zx7ul^K9sDQ3DlLcj}NuU9k*#b)~ZV0AmKsB{iWiS_<+lvI?0k9e@Lkrb`^UzzVS0?qlA=OYsZADmi1#c>lPW7&A`@c#|&}@3q8lES`}`@mj>25XXh^D4z8w z-iY{V#IKBu^9Ff4a=(CErDAFFy~)dRj>b83!5DMp=+K zkRP;>6|w;Goi-|mtb{z;Mm3PNklk%`0kRP?v7H7Wosfm?RowDHO zK%TiyR>%U#uIp3|Sqb@M2h~84ZF~NIx{d#SYSCW51B!bWj## z4&-+oWQ8n%oY+a_kd=_nc2W&wEo2*9=^P-hDXtT8Wf%G8V87^xncbv=jDx(=O<9mR zkUM+G3RwVoyNAjlD=3i_qiM&6Oui_ybKw7*Qf zVq6sd?}R_7?2knYf1mKvwTjU%{11iSA$GA;_+JQrqDD5W%kf75~BRHRvK~_ueUr|BRTHCj1#OG=HO>cWCHk;Jqk1yzv$F z!lxDd~ON9BuV+cUIB9pf9(vqV9ivw#wdQF2xp_+q}5i&lWtQc9}`V4Z_@LIWI7C- zHqt+V?j+&`nZ}di$R1QpI66w2+7PMadhnPA;d{)a9hi1_rV`#FR(wl@Ey90R_