#include #include using namespace std; //Sturcture definition struct Panda { string ZooName; string Gender; string Age; string ID; Panda *next; }; typedef Panda* Node; //aliasing string getID(void); //Function that gets the ID void displayList(Node); //Display the List Node insertNode(Node, Node); //Insert nodes inorder Node sortNode(Node, Node); //sorts by Zoo Name Node deleteNode(Node, string); //Delete a Node Node createNode(void); //Allocate memory for the node Node populateNode(Node); //Populate the node with values void displayNode(Node); //Display the created node Node searchList(Node, string); //Search the list based on the ID Node searchGender( Node, string); //Search the list based on Gender char menu(); //Menu to choose from the options void welcome(); //Greeting int main() { char choice; string userID; Node head = NULL ; //to store the head of the list Node newNode = NULL; // to store the new node that is created befor it is inserted into the list Node found = NULL; // a temporary varibale to store the found node during search welcome(); while(1) { choice =menu(); switch (choice) { //Load the current list from "zoo.dat" file case 'a': break; //Display current list case 'b': displayList(head); break; //Add a new panda case 'c': newNode = createNode(); newNode = populateNode(newNode); head = insertNode(head, newNode); break; //Delete a panda case 'd': userID = getID(); head = deleteNode(head, userID); break; //Search by Gender and Display case 'e': userID = getID(); found = searchList(head, userID); displayNode(found); break; //Sort by name of Zoo case 'f': displayList(head); head = sortNode(head, newNode); break; //Exit and update file case 'g': return 1; default: continue; } } } //creating a new empty node Node createNode(void) { Node newNode = new Panda; newNode->next = NULL; return newNode; } //populating an empty node Node populateNode(Node newNode) { cout << "Enter Zoo Name: "; cin >> newNode->ZooName; cout << "Enter Gender: "; cin >> newNode->Gender; cout << "Enter Age: "; cin >> newNode->Age; cout << "Enter ID: "; cin >> newNode->ID; return newNode; } //prompts the user to enter a ID for search and delete operations string getID() { string userID; cout << "Enter the ID you wish to delete/search: "; cin >> userID; return userID; } //displays a single node void displayNode(Node node) { //If address(node) sent is empty if(node == NULL) { cout << "Sorry. ID was not found"; } else { cout << endl; cout << "Zoo Name:"<< node->ZooName << endl; cout << "Gender:"<< node->Gender << endl; cout << "Age:"<< node->Age << endl; cout << "ID; "<< node->ID << endl; return; } } //function to display full list void displayList(Node head) { Node Temp; if( head == NULL ) { cout << "The list is empty."<< endl; return; } Temp = head; cout << "The list is as follows:" << endl; while (Temp != NULL) { displayNode(Temp); Temp = Temp->next; } return; } //Function to insert a new node in order of its ID Node insertNode(Node head, Node newNode) { Node prev, current; //case1: When the list is empty if(head == NULL) { return newNode; } //end of case1 prev = NULL; current = head; //case2: When the newNode has to become the headNode if(newNode->ID < head->ID ) { newNode->next = head; return newNode; } //end of case2 //case3: The list is not empty and the newNode need not have to be the headNode while(current != NULL) { if(current->ID < newNode->ID) { prev=current; current=current->next; } else break; } //case 3.1: If the newNode has to be the last node if(current == NULL) { prev->next=newNode; return head; } //end of case3.1 //case 3.2: newNode goes some where in the middle else { prev->next=newNode; newNode->next=current; return head; } //end of case3 } //Function to insert a new node in order of its ZooName Node sortNode(Node head, Node newNode) { Node prev, current; //case1: When the list is empty if(head == NULL) { return newNode; } //end of case1 prev = NULL; current = head; //case2: When the newNode has to become the headNode if(newNode->ZooName < head->ZooName ) { newNode->next = head; return newNode; } //end of case2 //case3: The list is not empty and the newNode need not have to be the headNode while(current != NULL) { if(current->ID < newNode->ZooName) { prev=current; current=current->next; } else break; } //case 3.1: If the newNode has to be the last node if(current == NULL) { prev->next=newNode; return head; } //end of case3.1 //case 3.2: newNode goes some where in the middle else { prev->next=newNode; newNode->next=current; return head; } //end of case3 } //functions to search for a Node Node searchList(Node head,string userID) { Node current = head; //case1: When the list is empty if(head == NULL) { return head; } //end of case1 //case2: while(current != NULL) { //ID found if(current->ID == userID) { return current; } else //ID was not found { current=current->next; } } //If we get to the end of the list without finding the ID if(current == NULL) { return NULL; } return head; } //Function to delete a Node Node deleteNode(Node head,string userID) { Node current = head, prev=NULL; //case1: When the list is empty if(head == NULL) { cout << "List is empty"<< endl; return head; } //end of case1 //case2: The head node is to be deleted if(head->ID == userID) { head = head->next; delete current; return head; } //case3: We have to delete an intermediate node while(current != NULL) { //UIN found if(current->ID == userID) { prev->next = current->next; delete current; return head; } else //ID was not found { prev=current; current=current->next; } } //If we get to the end of the list without finding the ID if(current == NULL) { cout << "ID was not found. Could not perform the delete function."<< endl; return head; } return head; } //user menu char menu() { char choice; cout<> choice; system("cls"); cout << endl; return choice; } //welcome screen void welcome() { cout << "***********************************"<< endl; cout << " PANDA LINKED LIST" << endl; cout << "***********************************"<< endl; }