It was another fine morning at Kinokuniya (the bookstore where Raphael works part-time). Raphael's employer was very happy with the program that he submitted thanks to your help and promised him a bonus if he also is able to manage the long queues to the register. The employer wants to be able to:
Being the diligent worker he is, Raphael has already started writing code for this. He has started implementing a linked list in C++, and has written functions for 1 and 4. Help him finish the implementation by writing functions for 2 and 3. His code is available here. Refer to the comments in the .cpp file for his outline on how he thinks you should implement functions 2 and 3.
#include <iostream>
#include <string>
using namespace std;
typedef struct node
{
string name;
struct node* next;
} node_t;
/*-----
* Function to take a name and add a new node to the list given by node_t* head.
* It returns back the updated list.
* -----
*/
node_t* add_to_end(string name_to_add, node_t* head)
{
node_t* newNode = new node_t;
newNode->name = name_to_add;
newNode->next = NULL;
if(head == NULL) // If the list is empty
{
head = newNode;
}
else // If the list is already populated, traverse to the end of the list and add newNode there.
{
node_t* p = head;
while(p->next!=NULL)
{
p = p->next;
}
p->next = newNode;
}
return head;
}
/*-----
* Function to print the name of the person at front, and remove him/her from the list.
* This function should not do anything if the list is empty.
* It should update head, and return back head.
* -----
*/
node_t* remove_from_front(node_t* head)
{
if(head == NULL)
{
cout << "List is empty!" << endl;
return NULL;
}
else
{
cout << "Person at front: " << head->name << endl;
node_t* p = head; // Keep a copy of head before deleting it!
head = head->next; // Change head node
delete p;
}
return head;
}
/*-----
* Function to search for a specific person in the list node_t* head.
* If said person is found, function should return the position of this person from the front.
* If said person is not found, function should return -1.
* -----
*/
int search_for_person(string searchName, node_t* head)
{
node_t* p = head;
int position = 1;
while(p!=NULL)
{
if(p->name == searchName)
{
cout << "Person " << searchName << " found at position " << position << " in the queue!\n";
return position;
}
p = p->next;
}
// If we reach here, that means the while loop has ended without the function terminating. This means searchName was not found in the list.
return -1;
}
// Function to print the entire contents of the queue
void print_queue(node_t* head)
{
if(head == NULL)
{
cout << "List is empty!" << endl;
return;
}
cout << "The current list is:\n";
node_t* p = head;
do
{
cout << p->name << endl;
p = p->next;
}while(p!=NULL);
}
int main()
{
node_t* head = NULL;
head = add_to_end("TestPerson1",head);
head = add_to_end("TestPerson2",head);
print_queue(head);
cout << "Searching for TestPerson2:" << search_for_person("TestPerson2", head)<<endl;
print_queue(head);
cout << "Removing one person from the front!\n";
head = remove_from_front(head);
print_queue(head);
return 0;
}