Directory:Derek Elder/Programs/LinkedListPhoneBook

PhoneBook.h

#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <afxwin.h>
using namespace std;

#define new DEBUG_NEW

struct PhoneBookItem
{
	string m_name;
	int m_age;
	string m_phone;
	
	PhoneBookItem* m_next;
	PhoneBookItem(const string& name, int age, const string& phone);
	//Purpose:Default Constructor
	//Precondition:None
	//Postcondition:Data is initialized.
};
ostream& operator<<(ostream& os, const PhoneBookItem& phonebooklist);

class PhoneBook
{
	friend ostream& operator<<(ostream& os, const PhoneBook& phonebook);
public:
	PhoneBook();
	//Purpose:Default Constructor
	//Precondition:None
	//Postcondition:Data is initialized.
	PhoneBook(const PhoneBook& pb);
	//Purpose:Constructor
	//Precondition:None
	//Postcondition:Data is initialized.
	~PhoneBook();
	//Purpose:Deconstructor
	//Precondition:None
	//Postcondition:Data is erased.
	PhoneBook& operator=(const PhoneBook& pb);
	//Purpose:Overload the = operator.
	//Precondition:None
	//Postcondition:Copy function is called and the contents of the first phonebook are copied into the second phonebook.
	bool IsEmpty() const;
	//Purpose:Checks to see if the list is empty.
	//Precondition:None
	//Postcondition:1.Return true is the list is empty.
	//		2.Return false if the list contains data.
	int Size() const;
	//Purpose:Checks the size of the list.
	//Precondition:None
	//Postcondition:Returns the size of the list.
	bool Insert(const string& name, int age, const string& phone); //modify for trailer pointer
	//Purpose:To insert a person's name, age, and phone number into the phone book.
	//Precondition:None
	//Postcondition:1.Returns true if the insert is successful.
	//		2.Returns false if the insert is not successful.
	bool Delete(const string& name);
	//Purpose:To delete a person's name, age, and phone number into the phone book.
	//Precondition:
	//Postcondition:1.Returns true if the delete is successful.
	//		2.Returns false if the idelete is not successful.
	bool Lookup(const string& name, int age, string& phone) const; //int&age &phone
	//Purpose:To search for a specific person in the phone book.
	//Precondition:None
	//Postcondition:1.Returns true if the search is successful and the phonebook contains data.
	//		2.Returns false if the search is not successful and the given item is not found.
private:
	void Clear();
	//Purpose:Clears the phonebook of all data.
	//Precondition:None
	//Postcondition:The data in the given phonebook is erased.
	void Copy(const PhoneBook& pb2);
	//Purpose:Copies a given phonebook's data into another phonebook.
	//Precondition:None
	//Postcondition:The second phonebook contains the data of the first phonebook.

	PhoneBookItem* m_head;
	int m_num;
};

PhoneBook.cpp

#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include "PhoneBook.h"
using namespace std;

PhoneBookItem::PhoneBookItem(const string& name, int age, const string& phone) 
:m_name(name), m_age(age), m_phone(phone), m_next(NULL)
{}
ostream& operator<<(ostream& os, const PhoneBookItem& pbList)
{
	os<<"Name: "<<pbList.m_name<<"\t\tAge: "<<pbList.m_age<<"\t\tPhone Number: "<<pbList.m_phone<<endl;
	return os;
}
ostream& operator<<(ostream& os, const PhoneBook& pb)
{
	PhoneBookItem *p = pb.m_head->m_next;

	if(pb.Size() == 0)
	{
		os<<"The phonebook is empty."<<endl;
		return os;
	}
	else
	{
		while(p != 0)
		{
			os<<*p;
			p = p->m_next;
		}
		return os;
	}
}
PhoneBook& PhoneBook::operator=(const PhoneBook& pb)
{
	if(this != &pb)
	{
		Clear();
		Copy(pb);
	}
	return *this;
}
PhoneBook::PhoneBook() 
:m_head(new PhoneBookItem("",-99,"")), m_num(0)
{}
PhoneBook::PhoneBook(const PhoneBook& pb) 
{
	m_head = NULL;
	m_num = 0;
	Copy(pb);
}
PhoneBook::~PhoneBook() 
{
	Clear();
}
bool PhoneBook::IsEmpty() const
{
	if(m_num == 0)
		return true;
	else
		return false;
}
int PhoneBook::Size() const
{
	return m_num;
}
bool PhoneBook::Insert(const string& name, int age, const string& phone)
{
	PhoneBookItem* temp = m_head;

	int tempAge = 0;
	string tempPhone = "";
	int counter = 0;

	if(Size() >= 0)
	{
		if(Lookup(name,tempAge,tempPhone))
		{
			return false;
		}

		while((counter < Size()) && ((temp->m_next)->m_name < name))
		{
			temp = temp->m_next;
			counter++;
		}

		PhoneBookItem* pb2 = new PhoneBookItem(name,age,phone);

		pb2->m_next = temp->m_next;
		temp->m_next = pb2;
		m_num++;
	}
	return true;
}
bool PhoneBook::Delete(const string& name) 
{
	PhoneBookItem *p = m_head;
	while(p->m_next != 0)
	{
		if(p->m_next->m_name == name)
		{
			PhoneBookItem* removeIt = p->m_next;
			p->m_next = p->m_next->m_next;
			
			delete removeIt;
			m_num--;
			return true;
		}
		p = p->m_next;
	}
	return false;
}
bool PhoneBook::Lookup(const string& name, int age, string& phone) const
{
	PhoneBookItem *p = m_head->m_next;
	while((p != 0) && (p->m_name <= name))
	{
		if(p->m_name == name)
		{
			age = p->m_age;
			phone = p->m_phone;
			return true;
		}
		p = p->m_next;
	}
 	return false;
}
void PhoneBook::Clear()
{
	PhoneBookItem* p = m_head;
	PhoneBookItem* temp;
	while(p != 0)
	{
		temp = p;
		p = p->m_next;

		delete temp;
	}
}
void PhoneBook::Copy(const PhoneBook& pb2)
{
	PhoneBookItem* p2 = pb2.m_head->m_next;
	PhoneBookItem* pThis = new PhoneBookItem("",-99,"");
	m_head = pThis;

	while(p2 != 0)
	{
		pThis->m_next = new PhoneBookItem(p2->m_name,p2->m_age,p2->m_phone);

		p2 = p2->m_next;
		pThis = pThis->m_next;
	}

	m_num = pb2.m_num;
}

Main.cpp

#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include "PhoneBook.h"
using namespace std;

void clearScreen();
//Purpose:To clear the screen.
//Precondition:None
//Postcondition:Screen is cleared.
char displayMenuAndGetSelection();
//Purpose:To display the menu and get the selection for searching.
//Precondition:None
//Postcondition:Search choice is entered and appropriate function is called.
void Pause();
//Purpose:To pause the program and allow the user a break.
//Precondition:None
//Postcondition:None
void quitProgram();
//Purpose:To inform the user the program has been terminated.
//Precondition:None
//Postcondition:Program terminated.
void doLookup(PhoneBook& pb);
//Purpose:doLookup function calls Lookup function to find a person from the phonebook.
//Precondition:Choice must be selected from the menu.
//Postcondition:Lookup is performed and results are displayed.
void doInsert(PhoneBook& pb);
//Purpose:doInsert function calls Insert function to insert a person into the phonebook.
//Precondition:Choice must be selected from the menu.
//Postcondition:Insert is performed and results are displayed.
void doDelete(PhoneBook& pb);
//Purpose:doDelete function calls Delete function to delete a person from the phonebook.
//Precondition:Choice must be selected from the menu.
//Postcondition:Delete is performed and results are displayed.

void main()
{
	PhoneBook pb1;
	bool done = false;

	cout<<"Before any people are inserted into the phonebook."<<endl;
	cout<<pb1; //Should print out no one is present.

	//Initial inserts
	pb1.Insert("Joe",23,"11234567890");
	pb1.Insert("Marv",40,"15555555555");
	pb1.Insert("Larry",33,"12121212121");
	pb1.Insert("Kenrick",15,"18001314554");
	pb1.Insert("Joe",26,"19375530293"); //Should not insert because a 
					    //person with the name of Joe is already present.
	cout<<"=======PhoneBook 1======="<<endl;
	//overload << operator
	cout<<pb1;

	cout<<"=======PhoneBook 2======="<<endl;
	//call copy function
	PhoneBook pb2(pb1);
	pb2.Delete("Joe"); //deletes Joe out of pb2 so only three names should appear.
	cout<<pb2;

	cout<<"=======PhoneBook 3======="<<endl;
	PhoneBook pb3;
	//overload = operator
	pb3 = pb1;
	cout<<pb3;

	Pause();
	while(!done)
	{
		char menuChoice = ' ';

		menuChoice = displayMenuAndGetSelection();
		clearScreen();
		switch(menuChoice)
		{
			case '1':
				cout<<pb1;
				Pause();
				done = false;
				break;
			case '2':
				doInsert(pb1);
				Pause();
				done = false;
				break;
			case '3':
				doDelete(pb1);
				Pause();
				done = false;
				break;
			case '4':
				doLookup(pb1);
				Pause();
				done = false;
				break;
			case '5':
				cout<<"There are currently "<<pb1.Size()<<" people in the phonebook."<<endl;
				Pause();
				done = false;
				break;
			case '6':
				quitProgram();
				done = true;
				break;
			default:
				cout<<"Incorrect choice selected"<<endl;
				Pause();
				done = false;
				break;
		}
	}
}
void clearScreen()
{
	system("cls");
}
char displayMenuAndGetSelection()
{
	char choice;
	clearScreen();
	cout<<endl<<endl<<endl;
	cout<<"'1' -- View the Phonebook."<<endl<<endl;
	cout<<"'2' -- Insert a new person's information into the phonebook."<<endl<<endl;
	cout<<"'3' -- Delete a person's information from the phonebook."<<endl<<endl;
	cout<<"'4' -- Search the phonebook."<<endl<<endl;
	cout<<"'5' -- Count the number of people in the phonebook."<<endl<<endl;
	cout<<"'6' -- Quit the program."<<endl<<endl;
	cin>>choice;
	cin.ignore(50,'\n');
	return choice;
}
void Pause()
{
	cout<<endl<<"Press 'ENTER' to continue..."<<endl;
	cin.get();
}
void quitProgram()
{
	cout<<"Program terminated, good bye!"<<endl;
}
void doLookup(PhoneBook& pb)
{
	string name,phone;
	cout<<"What person would you like to search for? ";
	cin>>name;
	cin.ignore(50,'\n');

	pb.Lookup(name,0,phone);

	if((pb.Lookup(name,0,phone)) == true)
	{
		cout<<endl<<"The person you have searched for is in the phonebook."<<endl;
		cout<<"The phone number of the person is: "<<phone<<endl;
	}
	else
	{
		cout<<endl<<"The person you have searched for is not in the phonebook."<<endl;
	}
}
void doInsert(PhoneBook& pb)
{
	string name, phone;
	int age;

	cout<<"Please enter the relevant information to be entered into the phonebook."<<endl;
	cout<<"Name: ";
	cin>>name;
	cout<<"Age: ";
	cin>>age;
	cout<<"Phone Number: ";
	cin>>phone;
	cin.ignore(50,'\n');

	pb.Insert(name,age,phone);
	cout<<endl<<"Insert has been performed."<<endl;
}
void doDelete(PhoneBook& pb)
{
	string name;
	cout<<"What person would you like to delete from the phonebook? ";
	cin>>name;
	cin.ignore(50,'\n');

	pb.Delete(name);
	cout<<endl<<"Delete has been performed."<<endl;
}