Insight into something.
|
Assignment : |
|
|
Source Code : |
|
|
Compiled Executables : |
|
|
Documentation : |
|
|
Sample Test Files : |
////////////////////////////////////////////////////////////////////////////////
///
/// \file defaultfilename
/// \brief
///
/// <br>Author(s): Nicholas Guthrie
/// <br>Created: 2011-04-18
/// <br>Email: defaultemail
/// <br>Web: http://nickguthrie.com
/// <br>Title: Getting int a Club (Heaps)
/// <br>Course:
/// <br> Class #:
/// <br>Section #:
///
/// THIS SOFTWARE IS PROVIDED BY THE NICHOLAS GUTHRIE''AS IS'' AND ANY EXPRESS
/// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
/// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
/// NO EVENT SHALL UCF BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
/// EXEMPLARY,OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
/// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
/// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
/// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
/// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
/// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
///
////////////////////////////////////////////////////////////////////////////////
///////////////////////////
// Debugging #defines //
///////////////////////////
#define _CRT_SECURE_NO_WARNINGS // stops MSDN warnings
#define DEBUG // debug mode for better testing
///////////////////////////
// Globals & Constants //
///////////////////////////
#define MAXPEOPLE 500 // max people that can be in a line
///////////////////////////
// Library Includes //
///////////////////////////
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
///////////////////////////
// Struct Declarations //
///////////////////////////
typedef struct {
int time;
int hour;
int min;
char modifier[3];
} Time;
struct BST{
char name[29]; ///< first name of person
Time *enter;
Time *exit;
int time_in_line;
int time_in_club; ///< min spent in the club
int priority;
struct BST *left;
struct BST *right;
};
typedef struct {
struct BST ** heaparray;
int capacity;
int size;
}Heap;
///////////////////////////
// Function Prototypes //
///////////////////////////
// Print
int Print_Error(char * error_message);
void Print_Summary(struct BST *node);
void Print_Person_Summary(struct BST *person);
void Print_Person(struct BST *person);
void Print_Heap(Heap *h);
void Print_BST(struct BST *node);
void File_Print_Summary(struct BST *node, FILE *output);
// Main Functions
void PeopleEnterLine(struct BST *AllPeople, Heap *WaitingList, int time);
void PeopleEnterClub(Heap *OutsideClub, Heap *InsideClub, int current_time);
void PeopleLeaveClub(Heap * InsideClub, int current_time);
void IncramentTime(Heap *h, Heap *InsideClub, int current_time);
// Time
Time *InitTime(int hour, int min, char modifier[3]);
Time *InitEmptyTime();
int ConvertToMinutes(int hour, int minutes, char *modifier);
int BST_Min_Enter_Time(struct BST * tree, int time);
int BST_Max_Exit_Time(struct BST * tree, int time);
// Heap
Heap *InitHeap(int size);
void Heap_Swap(Heap *h, int index1, int index2);
int Heap_Maximum(int a, int indexa, int b, int indexb);
void Free_Heap(Heap *h);
//--outside
struct BST * Heap_Outside_Pop(Heap *h);
void Heap_Outside_Insert(Heap *h, struct BST *person);
void Heap_Outside_PercolateDown(Heap *h, int index);
void Heap_Outside_PercolateUp(Heap *h, int index);
//--inside
void Heap_Inside_Pop(Heap *h);
void Heap_Inside_Insert(Heap *h, struct BST *person);
void Heap_Inside_PercolateDown(Heap *h, int index);
void Heap_Inside_PercolateUp(Heap *h, int index);
// BST
struct BST *InitBST();
void Free_BST(struct BST * tree);
struct BST* BST_FindName(struct BST *current_ptr, char name[29]);
struct BST * BST_Insert(struct BST *root, struct BST *element);
///////////////////////////
// Main //
///////////////////////////
int main()
{
/////////////////////
// Variables //
/////////////////////
FILE *input, *output; //input & output files
// Data Storage
// Input Collection
int num_clubs, num_events, club_capacity, current_time;
char time[3];
int hour, min, priority;
char modifier[3]; //AM or PM
char name[29];
char mode; //E = enter, L = leaving
// Other
int i, j; //navigation variablges
/////////////////////
// Initializations //
/////////////////////
input = fopen("club.in", "r");
output = fopen("club.out", "w");
if(input == NULL || output == NULL)
return Print_Error("File not found.");
/////////////////////
// Read Input //
/////////////////////
// FOR all clubs
fscanf(input, "%d\n", &num_clubs);
if(num_clubs < 0)
Print_Error("The number of clubs must be greater than 0.");
for(i = 0; i<num_clubs; i++)
{
struct BST *AllPeople = NULL;
struct BST *NewBST = NULL;
fprintf(output, "Club #%d:\n\n", i+1);
fscanf(input, "%d%d\n", &num_events, &club_capacity);
AllPeople = NULL;
NewBST = NULL;
// FOR all events
for(j = 0; j<num_events; j++)
{
// Initialize the Outside Heap.
fgets(time, 3, input);
hour = atoi(time); //convert string time to int time
fgetc(input);
fgets(time, 3, input);
min = atoi(time);
fscanf(input, "%s%s%s", modifier, &mode, name);
// The person is entering
if(mode == 'E')
{
fscanf(input, "%d\n", &priority);
NewBST = InitBST();
strcpy(NewBST->name, name);
NewBST->priority = priority;
NewBST->enter = InitTime(hour, min, modifier);
AllPeople = BST_Insert(AllPeople, NewBST);
}
// The person is leaving
else if (mode == 'L')
{
fscanf(input, "\n");
NewBST = BST_FindName(AllPeople, name);
NewBST->exit = InitTime(hour, min, modifier);
}
else
return Print_Error("Invalid Enter/Leave Mode:");
}//END Events
Heap * WaitList = InitHeap(MAXPEOPLE);
Heap * InsideClub = InitHeap(club_capacity);
//WaitList = InitHeap(MAXPEOPLE);
//InsideClub = InitHeap(club_capacity);
int tmin = BST_Min_Enter_Time(AllPeople, 48*60);
int tmax = tmin + 20*60;
tmin--;
tmax++;
for(current_time = tmin; current_time < tmax; current_time++)
{
printf("CURRENT TIME = %d\n", current_time);
printf("---------- INSIDE ---------- ");
Print_Heap(InsideClub);
printf("---------- OUTSIDE ---------- ");
Print_Heap(WaitList);
PeopleLeaveClub(InsideClub, current_time);
PeopleEnterLine(AllPeople, WaitList, current_time);
PeopleEnterClub(WaitList, InsideClub, current_time);
IncramentTime(WaitList, InsideClub, current_time);
}
File_Print_Summary(AllPeople,output);
Free_BST(AllPeople);
Free_BST(NewBST);
Free_Heap(WaitList);
Free_Heap(InsideClub);
fprintf(output, "\n");
}//END Clubs
fclose(input);
fclose(output);
}//END Main
//////////////////////////////
// Function Implamentations //
//////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// GENERAL
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///
/// \brief Prints an error message.
/// \param error_message The error message to print.
/// \return 0, so the program can be exited.
///
////////////////////////////////////////////////////////////////////////////////
int Print_Error(char * error_message){
printf(" ERROR: %s Press any key to exit program.\n", error_message);
getchar(); // wait for user input
return 0;
}
////////////////////////////////////////////////////////////////////////////////
///
/// \brief (for debugging) Prints list of people in heap
/// \param HeapStruct *h Pointer to a valid HeapStruct to print.
/// \return void
///
////////////////////////////////////////////////////////////////////////////////
void Print_Heap(Heap *h)
{
int i; //navigation variable
if(h->size > 0)
{
printf(" ____ Print Heap ____\n");
printf("| # | P | Name | Enter | Exit |\n");
printf("|----|---|-------|-------|------|\n");
for (i=1; i <= h->size; i++)
printf("| %.2d | %d | %.4s\t | %d | %d | %d\n", i, h->heaparray[i]->priority,
h->heaparray[i]->name ,h->heaparray[i]->enter->time,
h->heaparray[i]->exit->time, h->heaparray[i]->time_in_club);
}
}
////////////////////////////////////////////////////////////////////////////////
///
/// \brief Prints all members of a BST in alphabetical order.
/// \param node Root of BST to print.
/// \return void
///
////////////////////////////////////////////////////////////////////////////////
void Print_BST(struct BST *node)
{
if(node != NULL){
if(node->right !=NULL)
Print_BST(node->right);
Print_Person(node);
if(node->left !=NULL)
Print_BST(node->left);
}
}
////////////////////////////////////////////////////////////////////////////////
///
/// \brief Prints all people alphabetically & summary of their data.
/// \param node Root of BST to print.
/// \return void
///
////////////////////////////////////////////////////////////////////////////////
void Print_Summary(struct BST *node)
{
if(node != NULL)
{
if(node->right !=NULL)
Print_Summary(node->right);
Print_Person_Summary(node);
if(node->left !=NULL)
Print_Summary(node->left);
}
}
void Print_Person_Summary(struct BST *person)
{
printf("%s waited %d minutes and ", person->name, person->time_in_line);
if(person->time_in_club > 0)
printf("stayed in the club for %d minutes.\n", person->time_in_club);
else
printf("and never got into the club.\n");
}
void File_Print_Summary(struct BST *node, FILE *output)
{
if(node != NULL)
{
if(node->right !=NULL)
File_Print_Summary(node->right, output);
fprintf(output, "%s waited %d minutes and ", node->name, node->time_in_line);
if(node->time_in_club > 0)
fprintf(output, "stayed in the club for %d minutes.\n", node->time_in_club);
else
fprintf(output, "and never got into the club.\n");
if(node->left !=NULL)
File_Print_Summary(node->left, output);
}
}
void Print_Person(struct BST *person)
{
printf(" __ Print Person __\n");
printf(" Name.......%s\n", person->name);
printf(" Enter......%d:%d %s = %d minutes\n", person->enter->hour,
person->enter->min, person->enter->modifier, person->enter->time);
printf(" Exit.......%d:%d %s = %d minutes\n", person->exit->hour,
person->exit->min, person->exit->modifier, person->exit->time);
printf(" In Club....%d minutes\n", person->time_in_club);
printf(" In Line....%d minutes\n", person->time_in_line);
printf(" Priority:..%d\n", person->priority);
printf("\n");
}
////////////////////////////////////////////////////////////////////////////////
/// MAIN FUNCTIONS
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///
/// \brief Adds one minute to the waiting time of all people
/// \param HeapStruct *h Pointer to a valid HeapStruct with people in it.
/// \return void
///
////////////////////////////////////////////////////////////////////////////////
void IncramentTime(Heap *h, Heap *InsideClub, int current_time)
{
int i;
for(i = 1; i<=h->size; i++)
if(h->heaparray[i]->exit->time > current_time)
h->heaparray[i]->time_in_line = h->heaparray[i]->time_in_line +1;
for(i = 1; i<=InsideClub->size; i++){
InsideClub->heaparray[i]->time_in_club =
InsideClub->heaparray[i]->time_in_club +1;
printf("%s = %d\n", InsideClub->heaparray[i]->name, InsideClub->heaparray[i]->time_in_club);
}
}
////////////////////////////////////////////////////////////////////////////////
///
/// \brief Searches a BST for people who want to enter the line.
///
////////////////////////////////////////////////////////////////////////////////
void PeopleEnterLine(struct BST *AllPeople, Heap *WaitingList, int time)
{
// if right is available, go right
if(AllPeople->right != NULL)
PeopleEnterLine(AllPeople->right, WaitingList, time);
// if time == then this is the alphabetically first person to add
if(AllPeople->enter->time == time)
Heap_Outside_Insert(WaitingList, AllPeople);
if(AllPeople->left != NULL)
PeopleEnterLine(AllPeople->left, WaitingList, time);
}
void PeopleEnterClub(Heap *WaitList, Heap *InsideClub, int current_time)
{
//repeat while there is room inside the club and room outside the club
while(InsideClub->size < InsideClub->capacity && WaitList->size > 0)
{
if(WaitList->heaparray[1]->exit->time <= current_time)
Heap_Outside_Pop(WaitList);
else
Heap_Inside_Insert(InsideClub, Heap_Outside_Pop(WaitList));
}
}
void PeopleLeaveClub(Heap * InsideClub, int current_time)
{
while(InsideClub->size > 0 && InsideClub->heaparray[1]->exit->time == current_time)
{
Heap_Inside_Pop(InsideClub);
}
}
////////////////////////////////////////////////////////////////////////////////
/// TIME
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///
/// \brief Initializes all members of an empty struct Time properly.
/// \return Pointer to a properly initialized struct Time.
///
////////////////////////////////////////////////////////////////////////////////
Time *InitTime(int hour, int min, char modifier[3])
{
Time *clock = (Time*)(malloc(sizeof(Time)));
clock->time = ConvertToMinutes(hour, min, modifier);
clock->hour = hour;
clock->min = min;
strcpy(clock->modifier,modifier);
return clock;
}
////////////////////////////////////////////////////////////////////////////////
///
/// \brief Initializes all members of an empty struct Time properly.
/// \return Pointer to a properly initialized struct Time.
///
////////////////////////////////////////////////////////////////////////////////
Time *InitEmptyTime()
{
Time *clock = (Time*)(malloc(sizeof(Time)));
clock->time = -1;
clock->hour = -1;
clock->min = -1;
strcpy(clock->modifier,"NN");
return clock;
}
////////////////////////////////////////////////////////////////////////////////
///
/// \brief Converts hour and minutes to the minutes past midnight.
/// \param hour The hour of the time (not military time)(0 <= hour <= 12)
/// \param minutes The minutes of the time.
/// \param modifier AM or PM.
/// \return The # of minutes that have passed in the day so far.
///
////////////////////////////////////////////////////////////////////////////////
int ConvertToMinutes(int hour, int minutes, char *modifier)
{
// if hour is PM add 12
if(strcmp(modifier, "PM") == 0)
return (12+hour)*60+minutes;
// since the "value" of morning (midnight = 0) should actually be > 11:59PM
else
{
if(hour == 12)
return(24)*60+minutes;
else
return(24+hour)*60+minutes;
}
}
////////////////////////////////////////////////////////////////////////////////
/// HEAP
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///
/// \brief Initializes an empty heap with a capacity of SIZE.
/// \param int size Max size of heap to initialize.
/// \return Pointer to a valid HeapStruct.
///
////////////////////////////////////////////////////////////////////////////////
Heap* InitHeap(int max_size)
{
Heap* list;
// allocate space for the heap and set the size for an empty heap.
list = (Heap*)(malloc(sizeof(Heap)));
list->capacity = max_size;
list->heaparray = (struct BST**)malloc(sizeof(struct BST)*(max_size+1));
list->size = 0;
return list;
}
void Free_Heap(Heap *h) {
free(h->heaparray);
free(h);
}
////////////////////////////////////////////////////////////////////////////////
///
/// \brief Inserts a value into a heap.
/// \param HeapStruct Pointer to a valid HeapStruct to insert the value in.
/// \param value Value to insert into the HeapStruct.
/// \return void
///
////////////////////////////////////////////////////////////////////////////////
void Heap_Outside_Insert(Heap *h, struct BST *person)
{
struct BST** temp;
//struct BST** throwaway;
int i; //navigation variable
//DEBUG - Capacity of heap should not grow.
// Our array is full, we need to allocate some new space!
/*if (h->size == h->capacity)
{
// We will double the size of the structure.
h->capacity *= 2;
// Allocate new space for an array.
temp = (struct BST**)malloc(sizeof(struct BST)*h->capacity+1);
// Copy all the items over.
for (i=1; i<=h->capacity; i++)
temp[i] = h->heaparray[i];
// Move the pointer and free the old memory.
throwaway = h->heaparray;
h->heaparray = temp;
free(throwaway);
}*/
// Adjust all the necessary components of h, and then move the inserted
// item into its appropriate location.
h->size = h->size +1;
// h->size++;
h->heaparray[h->size] = person; //DEBUG not sure if this is correct
Heap_Outside_PercolateUp(h, h->size);
}
////////////////////////////////////////////////////////////////////////////////
///
/// \brief Percolates up on a heap on a node.
/// \param HeapStruct Pointer to a valid HeapStruct to percolate up on.
/// \param index Node to percolate down from.
/// \return void
///
////////////////////////////////////////////////////////////////////////////////
void Heap_Outside_PercolateUp(Heap *h, int index)
{
// Can only percolate up if the node isn't the root.
if (index > 1)
{
// See if our current node is bigger in value than its parent.
if (h->heaparray[index/2]->priority < h->heaparray[index]->priority)
{
// Move our node up one level.
Heap_Swap(h, index, index/2);
// See if it needs to be done again.
Heap_Outside_PercolateUp(h, index/2);
}
}
}
////////////////////////////////////////////////////////////////////////////////
///
/// \brief Percolates down a heap on a node.
/// \param HeapStruct Pointer to a valid HeapStruct to percolate down on.
/// \param index Node to percolate down from.
/// \return void
///
////////////////////////////////////////////////////////////////////////////////
void Heap_Outside_PercolateDown(Heap *h, int index)
{
int min;
// Only try to percolate down internal nodes.
if ((2*index+1) <= h->size)
{
// Find the minimum value of the two children of this node
min = Heap_Minimum(h->heaparray[2*index]->priority, 2*index,
h->heaparray[2*index+1]->priority, 2*index+1);
// IF this value is greater than the current value, then we need to move
// our current value down the heap.
if (h->heaparray[index]->priority < h->heaparray[min]->priority) {
Heap_Swap(h, index, min);
// This part is recursive and allows us to continue percolating
// down the element in question.
Heap_Outside_PercolateDown(h, min);
}
}
// Case where our current element has exactly one child, a left child.
else if (h->size == 2*index) {
// Compare the current item to its only child.
// No recursive call is needed since the child of this node is a leaf.
if (h->heaparray[index]->priority < h->heaparray[2*index]->priority)
Heap_Swap(h, index, 2*index);
}
}
////////////////////////////////////////////////////////////////////////////////
///
/// \brief Removes the minimum value in the heap.
/// \param HeapStruct *h Pointer to a valid HeapStruct to remove the value from.
/// \return IF Successful, The value of the # deleted.
/// -1 to indicate failure.
///
////////////////////////////////////////////////////////////////////////////////
struct BST * Heap_Outside_Pop(Heap *h)
{
struct BST *retval;
// This is where the minimum is stored.
retval = h->heaparray[1];
// Copy the last value into this top slot.
h->heaparray[1] = h->heaparray[h->size];
// Our heap will have one fewer items.
h->size--;
// Need to let this value move down to its rightful spot in the heap.
Heap_Outside_PercolateDown(h, 1);
// Now we can return our value.
return retval;
}
////////////////////////////////////////////////////////////////////////////////
///
/// \brief Inserts a value into a heap.
/// \param HeapStruct Pointer to a valid HeapStruct to insert the value in.
/// \param value Value to insert into the HeapStruct.
/// \return void
///
////////////////////////////////////////////////////////////////////////////////
void Heap_Inside_Insert(Heap *h, struct BST *person)
{
struct BST** temp;
h->size = h->size +1;
h->heaparray[h->size] = person;
Heap_Inside_PercolateUp(h, h->size);
}
////////////////////////////////////////////////////////////////////////////////
///
/// \brief Percolates up on a heap on a node.
/// \param HeapStruct Pointer to a valid HeapStruct to percolate up on.
/// \param index Node to percolate down from.
/// \return void
///
////////////////////////////////////////////////////////////////////////////////
void Heap_Inside_PercolateUp(Heap *h, int index)
{
//only if not root
if (index > 1)
{
//if the exit time of parent > exit time of child, swap
if (h->heaparray[index/2]->exit->time > h->heaparray[index]->exit->time)
{
Heap_Swap(h, index, index/2);
Heap_Inside_PercolateUp(h, index/2);
}
}
}
////////////////////////////////////////////////////////////////////////////////
///
/// \brief Percolates down a heap on a node.
/// \param HeapStruct Pointer to a valid HeapStruct to percolate down on.
/// \param index Node to percolate down from.
/// \return void
///
////////////////////////////////////////////////////////////////////////////////
void Heap_Inside_PercolateDown(Heap *h, int index)
{
int pos;
// only internal nodes
if ((2*index+1) <= h->size)
{
//compare left & right children, get position of lesser child
pos = Heap_Minimum(h->heaparray[2*index]->exit->time, 2*index,
h->heaparray[2*index+1]->exit->time, 2*index+1);
//if the current value > than the minimum value, swap
if (h->heaparray[index]->exit->time > h->heaparray[pos]->exit->time)
{
Heap_Swap(h, index, pos);
Heap_Inside_PercolateDown(h, pos);
}
}
// case if only has 1 left child
else if (h->size == 2*index) {
// Compare the current item to its only child.
// No recursive call is needed since the child of this node is a leaf.
if (h->heaparray[index]->exit->time > h->heaparray[2*index]->exit->time)
Heap_Swap(h, index, 2*index);
}
}
////////////////////////////////////////////////////////////////////////////////
///
/// \brief Removes the minimum value in the heap.
/// \param HeapStruct *h Pointer to a valid HeapStruct to remove the value from.
/// \return IF Successful, The value of the # deleted.
/// -1 to indicate failure.
///
////////////////////////////////////////////////////////////////////////////////
void Heap_Inside_Pop(Heap *h)
{
h->heaparray[1] = h->heaparray[h->size];
h->size--;
Heap_Inside_PercolateDown(h, 1);
}
////////////////////////////////////////////////////////////////////////////////
///
/// \brief Swaps the two people stored in the heap.
/// \param HeapStruct *h Pointer to a valid HeapStruct to switch values in.
/// \param int index1 First person to swap.
/// \param int index2 Second person to swap.
/// \return void
///
////////////////////////////////////////////////////////////////////////////////
void Heap_Swap(Heap *h, int index1, int index2)
{
struct BST *temp = h->heaparray[index1];
h->heaparray[index1] = h->heaparray[index2];
h->heaparray[index2] = temp;
}
////////////////////////////////////////////////////////////////////////////////
///
/// \brief Finds the minimum of two numbers and returns the index location.
/// \param int a First integer to compare.
/// \param int indexa Index of the first integer.
/// \param int b Second integer to compare.
/// \param int indexb Index of the second integer.
/// \return IF a<b, Returns indexa
/// ELSE Returns indexb
///
////////////////////////////////////////////////////////////////////////////////
int Heap_Maximum(int a, int indexa, int b, int indexb)
{
// Return the value associated with a.
if (a > b)
return indexa;
// Return the value associated with b.
else
return indexb;
}
////////////////////////////////////////////////////////////////////////////////
///
/// \brief Finds the minimum of two numbers and returns the index location.
/// \param int a First integer to compare.
/// \param int indexa Index of the first integer.
/// \param int b Second integer to compare.
/// \param int indexb Index of the second integer.
/// \return IF a<b, Returns indexa
/// ELSE Returns indexb
///
////////////////////////////////////////////////////////////////////////////////
int Heap_Minimum(int a, int indexa, int b, int indexb)
{
// Return the value associated with a.
if (a < b)
return indexa;
// Return the value associated with b.
else
return indexb;
}
////////////////////////////////////////////////////////////////////////////////
/// BINARY SEARCH TREES
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///
/// \brief Initializes a dynamic array of people.
/// \param size The max number of people the BST can hold.
/// \return Pointer to the newly initialized empty BST.
///
////////////////////////////////////////////////////////////////////////////////
struct BST * InitBST()
{
//malloc enough enough size to store all of the struct
struct BST *list = (struct BST*)(malloc(sizeof(struct BST)));
list->enter = InitEmptyTime();
list->exit = InitEmptyTime();
list->left = NULL;
list->right = NULL;
return list;
}
////////////////////////////////////////////////////////////////////////////////
///
/// \brief Inserts a person into their proper location in a BST.
/// \param root A pointer to the root of the tree to insert the Person in.
/// \param element A pointer to the Person to be inserted.
/// \return The root of the tree with newly inserted person.
///
////////////////////////////////////////////////////////////////////////////////
struct BST * BST_Insert(struct BST *root, struct BST *element)
{
// Empty Tree Case
if (root == NULL)
return element;
else
{
// insert element to the right
if(strcmp(element->name, root->name) == -1)
{
// There is a right subtree to insert the node.
if (root->right != NULL)
root->right = BST_Insert(root->right, element);
// Place the node directly to the right of root.
else
root->right = element;
}
// element should be inserted to the left.
else
{
// There is a left subtree to insert the node.
if (root->left != NULL)
root->left = BST_Insert(root->left, element);
// Place the node directly to the left of root.
else
root->left = element;
}
// Return the root pointer of the updated tree.
return root;
}
}
void Free_BST(struct BST * tree)
{
if(tree->left!=NULL)
Free_BST(tree->left);
if(tree->right!=NULL)
Free_BST(tree->left);
//free(tree->enter);
//free(tree->exit);
//free(tree);
}
int BST_Max_Exit_Time(struct BST * tree, int time)
{
if(tree->exit->time > time)
time = tree->exit->time;
if(tree->left != NULL)
BST_Max_Exit_Time(tree->left, time);
if(tree->right != NULL)
BST_Max_Exit_Time(tree->right, time);
return time;
}
int BST_Min_Enter_Time(struct BST * tree, int time)
{
if(tree->enter->time < time)
time = tree->enter->time;
if(tree->left != NULL)
BST_Min_Enter_Time(tree->left, time);
if(tree->right != NULL)
BST_Min_Enter_Time(tree->right, time);
return time;
}
////////////////////////////////////////////////////////////////////////////////
///
/// \brief Searches the BST for a given name.
/// \param BST to search.
/// \param name Name to search the BST for.
/// \return Pointer to struct Person with found Name.
///
////////////////////////////////////////////////////////////////////////////////
struct BST* BST_FindName(struct BST *current_ptr, char name[29])
{
// Check if there are nodes in the tree.
if (current_ptr != NULL)
{
int value = strcmp(current_ptr->name, name);
// Found the value at the root.
if (value == 0)
return current_ptr;
// Search to the left.
if (value == -1)
return BST_FindName(current_ptr->left, name);
// Or...search to the right.
else
return BST_FindName(current_ptr->right, name);
}
else
return NULL; // No node found.
}