So I've been getting back into programming, making sure I get everything covered, but there's one problem that I have NEVER been able to figure out. I've been reading 'Beginning c++ through game programming' and on chapter 9 it has this following exercise which I haven't been able to figure out, nor have I found any clear info on.
The Lobby::AddPlayer() member function from the Game Lobby program is inefficient because it iterates through all of the player nodes to add a new player to the end of the line. Add an m_pTail pointer data member to the Lobby class that always points to the last player node in the line and use it to more efficiently add a player.
The code is here.
Anything you can tell me that could help me in the right direction (I've only added in the m_pTail variable).Code:#include <iostream> #include <string> using namespace std; class Player { public: Player(const string& name = ""); string GetName() const; Player* GetNext() const; void SetNext(Player* next); private: string m_Name; Player* m_pNext; // Pointer to next player in list }; Player::Player(const string& name): m_Name(name), m_pNext(0) {} string Player::GetName() const { return m_Name; } Player* Player::GetNext() const { return m_pNext; } void Player::SetNext(Player* next) { m_pNext = next; } class Lobby { friend ostream& operator<<(ostream& os, const Lobby& aLobby); public: Lobby(); ~Lobby(); void AddPlayer(); void RemovePlayer(); void Clear(); private: Player* m_pHead; Player* m_pTail; }; Lobby::Lobby(): m_pHead(0), m_pTail(0) {} Lobby::~Lobby() { Clear(); } void Lobby::AddPlayer() { //create a new player node cout << "Please enter the name of the new player: "; string name; cin >> name; Player* pNewPlayer = new Player(name); //if list is empty make head of list this new player if (m_pHead == 0) { m_pHead = pNewPlayer; } //otherwise find the end of the list and add the player there else { Player* pIter = m_pHead; while (pIter->GetNext() != 0) { pIter = pIter->GetNext(); } pIter->SetNext(pNewPlayer); } } void Lobby::RemovePlayer() { if (m_pHead == 0) { cout << "The game lobby is empty. No one to remove!\n"; } else { Player* pTemp = m_pHead; m_pHead = m_pHead->GetNext(); delete pTemp; } } void Lobby::Clear() { while (m_pHead != 0) { RemovePlayer(); } } ostream& operator<<(ostream& os, const Lobby& aLobby) { Player* pIter = aLobby.m_pHead; os << "\nHere's who's in the game lobby:\n"; if (pIter == 0) { os << "The lobby is empty.\n"; } else { while (pIter != 0) { os << pIter->GetName() << endl; pIter = pIter->GetNext(); } } return os; } int main() { Lobby myLobby; int choice; do { cout << myLobby; cout << "\nGAME LOBBY\n"; cout << "0 - Exit the program.\n"; cout << "1 - Add a player to the lobby.\n"; cout << "2 - Remove a player from the lobby.\n"; cout << "3 - Clear the lobby.\n"; cout << endl << "Enter choice: "; cin >> choice; switch (choice) { case 0: cout << "Good-bye.\n"; break; case 1: myLobby.AddPlayer(); break; case 2: myLobby.RemovePlayer(); break; case 3: myLobby.Clear(); break; default: cout << "That was not a valid choice.\n"; } } while (choice != 0); return 0; }



LinkBack URL
About LinkBacks



