The purpose of this lab is to give you practice with pointers and linked lists.
The following C++ code implements a linked list of names. Put these files into Visual Studio or on a Unix system (must be compiled with -std=c++11)
Node.h:
#pragma once
#include <string>
using namespace std;
class Node
{
private:
string name;
Node* next;
public:
Node();
Node(string theName, Node* nextNode);
string getName();
void setName(string newName);
Node* getNext();
void setNext(Node *newNext);
};
Node.cpp:#include <string>
#include "Node.h"
using namespace std;
Node::Node() : name(""), next(nullptr)
{
}
Node::Node(string theName, Node* nextNode) :
name(theName), next(nextNode)
{
}
string Node::getName()
{
return name;
}
void Node::setName(string newName)
{
name = newName;
}
Node* Node::getNext()
{
return next;
}
void Node::setNext(Node *newNext)
{
next = newNext;
}
LinkedList.h:#pragma once
#include "Node.h"
#include <string>
using namespace std;
class LinkedList
{
private:
Node* head; // Points to the first thing in the list
public:
LinkedList();
~LinkedList();
void add(string s); // Adds to front of list
void remove(string s); // Deletes first occurrence of s in the list
void output(); // Output everything in the list
};LinkedList.cpp:#include "LinkedList.h"
#include <iostream>
using namespace std;
LinkedList::LinkedList()
{
head = nullptr;
}
LinkedList::~LinkedList()
{
Node *temp = head;
while (temp != nullptr)
{
Node *next = temp->getNext();
delete temp;
temp = next;
}
}
// Output everything in the list
void LinkedList::output()
{
Node *temp = head;
while (temp != nullptr)
{
cout << temp->getName() << endl;
temp = temp->getNext();
}
cout << endl;
}
// Adds a new node with this string to the front of the linked list
void LinkedList::add(string s)
{
if (head == nullptr)
{
// New list, make head point to it
head = new Node(s, nullptr);
}
else
{
// Make a new node that points to head
Node *temp = new Node(s, head);
// Set head to the new node
head = temp;
}
}
// Deletes first occurrence of s in the list
void LinkedList::remove(string s)
{
Node *temp = head;
Node *previous = nullptr; // You might want to use this variable
while (temp != nullptr)
{
if (temp->getName() == s)
{
// If we are deleting the head of the list
if (temp == head)
{
head = head->getNext();
delete temp;
}
else
// We are deleting something that is not the head
{
previous->setNext(temp->getNext());
}
break;
}
previous = temp;
temp = temp->getNext();
}
}
main.cpp:#include "LinkedList.h"
#include <iostream>
using namespace std;
int main()
{
LinkedList mylist;
mylist.add("Armando");
mylist.add("Bobo");
mylist.add("Carlo");
mylist.add("Drogo");
mylist.add("Cyrano");
mylist.add("Frodo");
cout << "Output entire list" << endl;
mylist.output();
cout << "Output after removing Carlo" << endl;
mylist.remove("Carlo");
mylist.output();
cout << "Output after removing Frodo" << endl;
mylist.remove("Frodo");
mylist.output();
cout << "Output after removing Armando" << endl;
mylist.remove("Armando");
mylist.output();
return 0;
}
Node* contains(string target) function in the LinkedList class that takes a string as input. If the linked list contains the string then return a pointer to the Node with the string. If the linked list doesn't contain the string return nullptr.
With the pointer you can invoke ptrVar->getName() to output the name or
ptrVar->setName(newName) to change the name.void replace(string target, string newName) function in the LinkedList class that takes two strings. If target is in the linked list then it should be replaced with newName, otherwise nothing happens. You will probably want to use the contains function.
Show your working code to the instructor or lab assistant for credit, or email your solution by midnight.