#include #include #include #include #include "guestLinkedListClass.h" using namespace std; //************************************************************ // DinnerGuestList()- Constructor for class DinnerGuestList // Sets head to null and assigns 0 to every element in numOfMeals array // Returns: void //************************************************************* DinnerGuestList::DinnerGuestList() { head = NULL; // point head to NULL for (int i = 0; i < MAX_MEAL_TYPES; i++) { numOfMeals[i] = 0; } } // DinnerGuestList //************************************************************ // DinnerGuestList()- Destructor for class DinnerGuestList // calls FreeMem to delete linked list // Returns: void //************************************************************* DinnerGuestList::~DinnerGuestList() { FreeMem(); } // DinnerGuestList //************************************************************ // InsertSorted()- Takes name and checks the linked list // if the name is found, it deletes it from the linked list // Returns: void //************************************************************* void DinnerGuestList::InsertSorted(char name[], // char array for name MealType meal) // MealType for meal { DinnerGuest * currPtr = NULL; // DinnerGuest pointer DinnerGuest * prevPtr = NULL; // DinnerGuest pointer DinnerGuest * newNodePtr = NULL; //DinnerGuest pointer //allocate memory for new NodeType newNodePtr = new DinnerGuest; strcpy(newNodePtr->guestName, name); // copies name into linked list newNodePtr->mealTyp = meal; // copies meal into linked list numOfMeals[meal]++; // updates numOfMeals currPtr = head; while ( currPtr != NULL && strcmp( name, currPtr->guestName ) != 0 ) { prevPtr = currPtr ; // advance both pointers currPtr = currPtr->next ; } newNodePtr->next = currPtr ; // insert new node here if ( prevPtr == NULL ) head = newNodePtr ; else prevPtr->next = newNodePtr ; } // InsertSorted //************************************************************ // IsPresent()- Takes name and checks the linked list // if the name is found it returns true // Returns: bool //************************************************************* bool DinnerGuestList::IsPresent ( const char * const guestName) // name to look for { DinnerGuest * tempPtr = head; // DinnerGuest pointer while (tempPtr != NULL) // while tempPtr isnt NULL { if(strcmp(tempPtr->guestName, guestName) == 0) // compares names { return true; } tempPtr = tempPtr->next; } return false; } // IsPresent //************************************************************ // DeleteGuest()- Takes name and checks the linked list // if the name is found, it deletes it from the linked list // Returns: void //************************************************************* void DinnerGuestList::DeleteGuest ( const char * const guestName) // name to delete { DinnerGuest * delPtr = NULL; // DinnerGuest pointer DinnerGuest * currPtr = NULL; // DinnerGuest pointer //check to see if guestName is in first node if ( strcmp( guestName, head->guestName) == 0 ) { delPtr = head ; // If so, delete first node head = head->next ; //link is new head of list } else { // search for guestName in rest of list currPtr = head ; while ( strcmp( currPtr->next->guestName, guestName) != 0 ) currPtr = currPtr->next ; delPtr = currPtr->next ; currPtr->next = currPtr->next->next ; } numOfMeals[delPtr->mealTyp]--; delete delPtr ;//delete node } // DeleteGuest //************************************************************ // PrintGuestList()- Takes output file stream and prints // the linked list data // Returns: void //************************************************************* void DinnerGuestList::PrintGuestList(fstream & outFile) // output file stream { DinnerGuest * tempHead = head; // DinnerGuest pointer outFile << setw(WIDTH1) << "Guest Name" << setw(WIDTH2) << " Meal Type\n"; PrintChar(outFile, '-', WIDTH1+WIDTH2+WIDTH2); // calls PrintChar while (tempHead != NULL) // while tempHead isnt NULL { outFile << setw(WIDTH1); outFile << tempHead->guestName; outFile << setw(WIDTH2); outFile << MEAL_NAMES[tempHead->mealTyp]; outFile << "\n"; tempHead = tempHead->next; // updates tempHead to next node } PrintChar(outFile, '-', WIDTH1+WIDTH2+WIDTH2); outFile << "\n"; } //PrintGuestList //************************************************************ // PrintChar()- Takes two inputs, char and int, and prints a // a specific amount of characters based on the int // Returns: NA //************************************************************* void DinnerGuestList::PrintChar(fstream & outFile, //output filestream to print char char ch, //character to print int howMany) //number of times to print character { for(int i = 0; i < howMany; i++) { outFile << ch; // prints character } outFile << "\n"; // new line } //PrintChar //************************************************************ // PrintMeals()- Takes output file and // prints out how many of each type of meals were stored // Returns: NA //************************************************************* void DinnerGuestList::PrintMeals(fstream & outFile) // number of meals array { for (int i = 0; i < MAX_MEAL_TYPES; i++) { outFile << "The number of people eating " << MEAL_NAMES[i] << " is " << numOfMeals[i] << "\n"; } outFile << "\n"; // new line } // PrintMeals //************************************************************ // UpdateGuest()- Takes name and meal and checks the linkedlist // for the name then updates the mealtype for that name // Returns: bool //************************************************************* bool DinnerGuestList::UpdateGuest(char name[], // char array for name MealType meal) // MealType for meal { DinnerGuest * tempHead = head; // DinnerGuest pointer while ( tempHead != NULL) // while head isnt NULL { if ( strcmp(tempHead->guestName, name) == 0) //compares names { numOfMeals[tempHead->mealTyp]--; numOfMeals[meal]++; tempHead->mealTyp = meal; // updates meal type return true; } tempHead = tempHead->next; // update to next node } // while return false; } // UpdateGuest //************************************************************ // FreeMem()- Transverses through the linked list deleting each node // Returns: NA //************************************************************* void DinnerGuestList::FreeMem() { while (head != NULL) { DinnerGuest * tempPtr = head; head = head->next; delete tempPtr; // delete node tempPtr = NULL; } } // FreeMem