 -depthFirst: perform a depth-first traversal of the graph. Assuming “visiting” a node in the graph means to output its contents. Pseudocode: Depth first traversal at a given node, v: 1.Mark node v as visited 2. Visit the node 3. for each vertex u adjacent to v, if u is not visited, start the depth first traversal at u. ( This is a recursive algorithm)

Don't use plagiarized sources. Get Your Custom Essay on
GET AN ESSAY WRITTEN FOR YOU FROM AS LOW AS \$13/PAGE

-breadthFirst: perform a breadth-first traversal of the graph. Assuming “visiting” a node in the graph means to output its contents. Pseudocode: Breadth first traversal of a graph.( similar to traversing a binary tree level by level, nodes at each level are visited from left to right) 1.Starting at the first vertex, the graph is traversed as much as possible, then go to next vertex not yet visited. 2. Use a queue to implement the breadth first search algorithm.

-cycleFinder: traverse the graph and determine the node(s) that start cycle(s) in the graph. Use theunordered_map data structure in the STL to keep track of the nodes that have been visited.

Important: solutions for all three methods must be heavily-commented explaining how it works.

Testing/Client

Write a simple client to test the three methods. Use a single graph with a single cycle to test all three methods.

Below are the header files for the project

//graphType.h

#ifndef H_graph
#define H_graph

#include
#include
#include

using namespace std;

class graphType
{
public:
bool isEmpty() const;
//Function to determine whether the graph is empty.
//Postcondition: Returns true if the graph is empty;
// otherwise, returns false.

void createGraph();
//Function to create a graph.
//Postcondition: The graph is created using the

void clearGraph();
//Function to clear graph.
//Postcondition: The memory occupied by each vertex
// is deallocated.

void printGraph() const;
//Function to print graph.
//Postcondition: The graph is printed.

void depthFirstTraversal();
//Function to perform the depth first traversal of
//the entire graph.
//Postcondition: The vertices of the graph are printed
// using depth first traversal algorithm.

//Function to perform the breadth first traversal of
//the entire graph.
//Postcondition: The vertices of the graph are printed
// using breadth first traversal algorithm.

void cycleFinder();

graphType(int size = 0);
//Constructor
//Postcondition: gSize = 0; maxSize = size;
// graph is an array of pointers to linked
// lists.

~graphType();
//Destructor
//The storage occupied by the vertices is deallocated.

protected:
int maxSize; //maximum number of vertices
int gSize; //current number of vertices

private:
void dft(int v, bool visited[]);
//Function to perform the depth first traversal of
//the graph at a node specified by the parameter vertex.
//This function is used by the public member functions
//depthFirstTraversal and dftAtVertex.
//Postcondition: Starting at vertex, the vertices are
// printed using depth first traversal
// algorithm.
};

bool graphType::isEmpty() const
{
return (gSize == 0);
}

void graphType::createGraph()
{
ifstream infile;
char fileName;

int index;
int vertex;

if (gSize != 0)   //if the graph is not empty, make it empty
clearGraph();

cout << “Enter input file name: “;
cin >> fileName;
cout << endl;

infile.open(fileName);

if (!infile)
{
cout << “Cannot open input file.” << endl;
return;
}

infile >> gSize;   //get the number of vertices

for (index = 0; index < gSize; index++)
{
infile >> vertex;

{
} //end while
} // end for

infile.close();
} //end createGraph

void graphType::clearGraph()
{
int index;

for (index = 0; index < gSize; index++)
graph[index].destroyList();

gSize = 0;
} //end clearGraph

void graphType::printGraph() const
{
int index;

for (index = 0; index < gSize; index++)
{
cout << index << ” “;
graph[index].print();
cout << endl;
}

cout << endl;
} //end printGraph

void graphType::depthFirstTraversal()
{
//TODO
} //end depthFirstTraversal

void graphType::dft(int v, bool visited[])
{
//TODO
} //end dft

{
//TODO

void graphType::cycleFinder()

{

//TODO

}//end cycleFinder

//Constructor
graphType::graphType(int size)
{
maxSize = size;
gSize = 0;
}

//Destructor
graphType::~graphType()
{
clearGraph();
}

#endif

#include
#include

using namespace std;

//Definition of the node

template
struct nodeType
{
Type info;
};

template
{
public:
//Default constructor
//Postcondition: current = nullptr;

//Constructor with a parameter.
//Postcondition: current = ptr;

Type operator*();
//Function to overload the dereferencing operator *.
//Postcondition: Returns the info contained in the node.

//Postcondition: The iterator is advanced to the next
// node.

//Postcondition: Returns true if this iterator is equal to
// the iterator specified by right,
// otherwise it returns the value false.

//Overload the not equal to operator.
//Postcondition: Returns true if this iterator is not
// equal to the iterator specified by
// right; otherwise it returns the value
// false.

private:
nodeType *current; //pointer to point to the current
};

template
{
current = nullptr;
}

template
{
current = ptr;
}

template
{
return current->info;
}

template
{

return *this;
}

template
{
return (current == right.current);
}

template
{ return (current != right.current);
}

template
{
public:

void initializeList();
//Initialize the list to an empty state.
//Postcondition: first = nullptr, last = nullptr, count = 0;

bool isEmptyList() const;
//Function to determine whether the list is empty.
//Postcondition: Returns true if the list is empty,
// otherwise it returns false.

void print() const;
//Function to output the data contained in each node.
//Postcondition: none

int length() const;
//Function to return the number of nodes in the list.
//Postcondition: The value of count is returned.

void destroyList();
//Function to delete all the nodes from the list.
//Postcondition: first = nullptr, last = nullptr, count = 0;

Type front() const;
//Function to return the first element of the list.
//Precondition: The list must exist and must not be
// empty.
//Postcondition: If the list is empty, the program
// terminates; otherwise, the first
// element of the list is returned.

Type back() const;
//Function to return the last element of the list.
//Precondition: The list must exist and must not be
// empty.
//Postcondition: If the list is empty, the program
// terminates; otherwise, the last
// element of the list is returned.

virtual bool search(const Type& searchItem) const = 0;
//Function to determine whether searchItem is in the list.
//Postcondition: Returns true if searchItem is in the
// list, otherwise the value false is
// returned.

virtual void insertFirst(const Type& newItem) = 0;
//Function to insert newItem at the beginning of the list.
//Postcondition: first points to the new list, newItem is
// inserted at the beginning of the list,
// last points to the last node in the list,
// and count is incremented by 1.

virtual void insertLast(const Type& newItem) = 0;
//Function to insert newItem at the end of the list.
//Postcondition: first points to the new list, newItem
// is inserted at the end of the list,
// last points to the last node in the list,
// and count is incremented by 1.

virtual void deleteNode(const Type& deleteItem) = 0;
//Function to delete deleteItem from the list.
//Postcondition: If found, the node containing
// deleteItem is deleted from the list.
// first points to the first node, last
// points to the last node of the updated
// list, and count is decremented by 1.

//Function to return an iterator at the begining of the
//Postcondition: Returns an iterator such that current is
// set to first.

//Function to return an iterator one element past the
//last element of the linked list.
//Postcondition: Returns an iterator such that current is
// set to nullptr.

//default constructor
//Initializes the list to an empty state.
//Postcondition: first = nullptr, last = nullptr, count = 0;

//copy constructor

//destructor
//Deletes all the nodes from the list.
//Postcondition: The list object is destroyed.

protected:
int count; //variable to store the number of
//elements in the list
nodeType *first; //pointer to the first node of the list
nodeType *last; //pointer to the last node of the list

private:
//Function to make a copy of otherList.
//Postcondition: A copy of otherList is created and
// assigned to this list.
};

template
{
return(first == nullptr);
}

template
{
first = nullptr;
last = nullptr;
count = 0;
}

template
{
nodeType *temp; //pointer to deallocate the memory
//occupied by the node
while (first != nullptr) //while there are nodes in the list
{
temp = first; //set temp to the current node
delete temp; //deallocate the memory occupied by temp
}
last = nullptr; //initialize last to nullptr; first has already
//been set to nullptr by the while loop
count = 0;
}

template
{
destroyList(); //if the list has any nodes, delete them
}

template
{
nodeType *current; //pointer to traverse the list

current = first; //set current so that it points to
//the first node
while (current != nullptr) //while more data to print
{
cout << current->info << ” “;
}
}//end print

template
{
return count;
} //end length

template
{
assert(first != nullptr);

return first->info; //return the info of the first node
}//end front

template
{
assert(last != nullptr);

return last->info; //return the info of the last node
}//end back

template
{

return temp;
}

template
{

return temp;
}

template
{
nodeType *newNode; //pointer to create a node
nodeType *current; //pointer to traverse the list

if (first != nullptr) //if the list is nonempty, make it empty
destroyList();

if (otherList.first == nullptr) //otherList is empty
{
first = nullptr;
last = nullptr;
count = 0;
}
else
{
current = otherList.first; //current points to the
//list to be copied
count = otherList.count;

//copy the first node
first = new nodeType; //create the node

first->info = current->info; //copy the info
//the node to nullptr
last = first; //make last point to the
//first node
current = current->link; //make current point to
//the next node

//copy the remaining list
while (current != nullptr)
{
newNode = new nodeType; //create a node
newNode->info = current->info; //copy the info
//newNode to nullptr
last->link = newNode; //attach newNode after last
last = newNode; //make last point to
//the actual last node
current = current->link; //make current point
//to the next node
}//end while
}//end else
}//end copyList

template
{
destroyList();
}//end destructor

template
{
first = nullptr;
copyList(otherList);
}//end copy constructor

template
{
if (this != &otherList) //avoid self-copy
{
copyList(otherList);
}//end else

return *this;
}

#endif

#include
#include

using namespace std;

template
{
public:

bool isEmptyQueue() const;
//Function to determine whether the queue is empty.
//Postcondition: Returns true if the queue is empty,
// otherwise returns false.

bool isFullQueue() const;
//Function to determine whether the queue is full.
//Postcondition: Returns true if the queue is full,
// otherwise returns false.

void initializeQueue();
//Function to initialize the queue to an empty state.
//Postcondition: queueFront = nullptr; queueRear = nullptr

Type front() const;
//Function to return the first element of the queue.
//Precondition: The queue exists and is not empty.
//Postcondition: If the queue is empty, the program
// terminates; otherwise, the first
// element of the queue is returned.

Type back() const;
//Function to return the last element of the queue.
//Precondition: The queue exists and is not empty.
//Postcondition: If the queue is empty, the program
// terminates; otherwise, the last
// element of the queue is returned.

//Function to add queueElement to the queue.
//Precondition: The queue exists and is not full.
//Postcondition: The queue is changed and queueElement
// is added to the queue.

void deleteQueue();
//Function to remove the first element of the queue.
//Precondition: The queue exists and is not empty.
//Postcondition: The queue is changed and the first
// element is removed from the queue.

//Default constructor

//Copy constructor

//Destructor

private:
nodeType *queueFront; //pointer to the front of
//the queue
nodeType *queueRear; //pointer to the rear of
//the queue
};

//Default constructor
template
{
queueFront = nullptr; //set front to nullptr
queueRear = nullptr; //set rear to nullptr
} //end default constructor

template
{
return(queueFront == nullptr);
} //end

template
{
return false;
} //end isFullQueue

template
{
nodeType *temp;

while (queueFront!= nullptr) //while there are elements left
//in the queue
{
temp = queueFront; //set temp to point to the
//current node
//the next node
delete temp; //deallocate memory occupied by temp
}

queueRear = nullptr; //set rear to nullptr
} //end initializeQueue

template
{
nodeType *newNode;

newNode = new nodeType; //create the node

newNode->info = newElement; //store the info

if (queueFront == nullptr) //if initially the queue is empty
{
queueFront = newNode;
queueRear = newNode;
}
else //add newNode at the end
{
}

template
{
assert(queueFront != nullptr);
return queueFront->info;
} //end front

template
{
assert(queueRear!= nullptr);
return queueRear->info;
} //end back

template
{
nodeType *temp;

if (!isEmptyQueue())
{
temp = queueFront; //make temp point to the
//first node

delete temp; //delete the first node

if (queueFront == nullptr) //if after deletion the
//queue is empty
queueRear = nullptr; //set queueRear to nullptr
}
else
cout << “Cannot remove from an empty queue” << endl;
}//end deleteQueue

//Destructor
template
{
//Write the definition of the destructor
} //end destructor

template
{
//Write the definition of to overload the assignment operator

} //end assignment operator

//copy constructor
template
{
//Write the definition of the copy constructor
}//end copy constructor

#endif

template
{
public:
virtual bool isEmptyQueue() const = 0;
//Function to determine whether the queue is empty.
//Postcondition: Returns true if the queue is empty,
// otherwise returns false.

virtual bool isFullQueue() const = 0;
//Function to determine whether the queue is full.
//Postcondition: Returns true if the queue is full,
// otherwise returns false.

virtual void initializeQueue() = 0;
//Function to initialize the queue to an empty state.
//Postcondition: The queue is empty.

virtual Type front() const = 0;
//Function to return the first element of the queue.
//Precondition: The queue exists and is not empty.
//Postcondition: If the queue is empty, the program
// terminates; otherwise, the first
// element of the queue is returned.

virtual Type back() const = 0;
//Function to return the last element of the queue.
//Precondition: The queue exists and is not empty.
//Postcondition: If the queue is empty, the program
// terminates; otherwise, the last
// element of the queue is returned.

virtual void addQueue(const Type& queueElement) = 0;
//Function to add queueElement to the queue.
//Precondition: The queue exists and is not full.
//Postcondition: The queue is changed and queueElement
// is added to the queue.

virtual void deleteQueue() = 0;
//Function to remove the first element of the queue.
//Precondition: The queue exists and is not empty.
//Postcondition: The queue is changed and the first
// element is removed from the queue.
};

#endif

using namespace std;

template
{
public:
bool search(const Type& searchItem) const;
//Function to determine whether searchItem is in the list.
//Postcondition: Returns true if searchItem is in the
// list, otherwise the value false is
// returned.

void insertFirst(const Type& newItem);
//Function to insert newItem at the beginning of the list.
//Postcondition: first points to the new list, newItem is
// inserted at the beginning of the list,
// last points to the last node in the
// list, and count is incremented by 1.

void insertLast(const Type& newItem);
//Function to insert newItem at the end of the list.
//Postcondition: first points to the new list, newItem
// is inserted at the end of the list,
// last points to the last node in the
// list, and count is incremented by 1.

void deleteNode(const Type& deleteItem);
//Function to delete deleteItem from the list.
//Postcondition: If found, the node containing
// deleteItem is deleted from the list.
// first points to the first node, last
// points to the last node of the updated
// list, and count is decremented by 1.
};

template
search(const Type& searchItem) const
{
nodeType *current; //pointer to traverse the list
bool found = false;

current = first; //set current to point to the first
//node in the list

while (current != nullptr && !found) //search the list
if (current->info == searchItem) //searchItem is found
found = true;
else
current = current->link; //make current point to
//the next node
return found;
}//end search

template
{
nodeType *newNode; //pointer to create the new node

newNode = new nodeType; //create the new node

newNode->info = newItem; //store the new item in the node
newNode->link = first; //insert newNode before first
first = newNode; //make first point to the
//actual first node
count++; //increment count

if (last == nullptr) //if the list was empty, newNode is also
//the last node in the list
last = newNode;
}//end insertFirst

template
{
nodeType *newNode; //pointer to create the new node

newNode = new nodeType; //create the new node

newNode->info = newItem; //store the new item in the node
//to nullptr

if (first == nullptr) //if the list is empty, newNode is
//both the first and last node
{
first = newNode;
last = newNode;
count++; //increment count
}
else //the list is not empty, insert newNode after last
{
last->link = newNode; //insert newNode after last
last = newNode; //make last point to the actual
//last node in the list
count++; //increment count
}
}//end insertLast

template
{
nodeType *current; //pointer to traverse the list
nodeType *trailCurrent; //pointer just before current
bool found;

if (first == nullptr) //Case 1; the list is empty.
cout << “Cannot delete from an empty list.”
<< endl;
else
{
if (first->info == deleteItem) //Case 2
{
current = first;
count–;
if (first == nullptr) //the list has only one node
last = nullptr;
delete current;
}
else //search the list for the node with the given info
{
found = false;
trailCurrent = first; //set trailCurrent to point
//to the first node
current = first->link; //set current to point to
//the second node

while (current != nullptr && !found)
{
if (current->info != deleteItem)
{
trailCurrent = current;
}
else
found = true;
}//end while

if (found) //Case 3; if found, delete the node
{
count–;

if (last == current) //node to be deleted
//was the last node
last = trailCurrent; //update the value
//of last
delete current; //delete the node from the list
}
else
cout << “The item to be deleted is not in ”
<< “the list.” << endl;
}//end else
}//end else
}//end deleteNode

#endif

//graphType.h

#ifndef H_graph
#define H_graph

#include
#include
#include

using namespace std;

class graphType
{
public:
bool isEmpty() const;
//Function to determine whether the graph is empty.
//Postcondition: Returns true if the graph is empty;
// otherwise, returns false.

void createGraph();
//Function to create a graph.
//Postcondition: The graph is created using the

void clearGraph();
//Function to clear graph.
//Postcondition: The memory occupied by each vertex
// is deallocated.

void printGraph() const;
//Function to print graph.
//Postcondition: The graph is printed.

void depthFirstTraversal();
//Function to perform the depth first traversal of
//the entire graph.
//Postcondition: The vertices of the graph are printed
// using depth first traversal algorithm.

//Function to perform the breadth first traversal of
//the entire graph.
//Postcondition: The vertices of the graph are printed
// using breadth first traversal algorithm.

void cycleFinder();

graphType(int size = 0);
//Constructor
//Postcondition: gSize = 0; maxSize = size;
// graph is an array of pointers to linked
// lists.

~graphType();
//Destructor
//The storage occupied by the vertices is deallocated.

protected:
int maxSize; //maximum number of vertices
int gSize; //current number of vertices

private:
void dft(int v, bool visited[]);
//Function to perform the depth first traversal of
//the graph at a node specified by the parameter vertex.
//This function is used by the public member functions
//depthFirstTraversal and dftAtVertex.
//Postcondition: Starting at vertex, the vertices are
// printed using depth first traversal
// algorithm.
};

bool graphType::isEmpty() const
{
return (gSize == 0);
}

void graphType::createGraph()
{
ifstream infile;
char fileName;

int index;
int vertex;

if (gSize != 0)   //if the graph is not empty, make it empty
clearGraph();

cout << “Enter input file name: “;
cin >> fileName;
cout << endl;

infile.open(fileName);

if (!infile)
{
cout << “Cannot open input file.” << endl;
return;
}

infile >> gSize;   //get the number of vertices

for (index = 0; index < gSize; index++)
{
infile >> vertex;

{
} //end while
} // end for

infile.close();
} //end createGraph

void graphType::clearGraph()
{
int index;

for (index = 0; index < gSize; index++)
graph[index].destroyList();

gSize = 0;
} //end clearGraph

void graphType::printGraph() const
{
int index;

for (index = 0; index < gSize; index++)
{
cout << index << ” “;
graph[index].print();
cout << endl;
}

cout << endl;
} //end printGraph

void graphType::depthFirstTraversal()
{
//TODO
} //end depthFirstTraversal

void graphType::dft(int v, bool visited[])
{
//TODO
} //end dft

{
//TODO

void graphType::cycleFinder()

{

//TODO

}//end cycleFinder

//Constructor
graphType::graphType(int size)
{
maxSize = size;
gSize = 0;
}

//Destructor
graphType::~graphType()
{
clearGraph();
}

#endif

#include
#include

using namespace std;

//Definition of the node

template
struct nodeType
{
Type info;
};

template
{
public:
//Default constructor
//Postcondition: current = nullptr;

//Constructor with a parameter.
//Postcondition: current = ptr;

Type operator*();
//Function to overload the dereferencing operator *.
//Postcondition: Returns the info contained in the node.

//Postcondition: The iterator is advanced to the next
// node.

//Postcondition: Returns true if this iterator is equal to
// the iterator specified by right,
// otherwise it returns the value false.

//Overload the not equal to operator.
//Postcondition: Returns true if this iterator is not
// equal to the iterator specified by
// right; otherwise it returns the value
// false.

private:
nodeType *current; //pointer to point to the current
};

template
{
current = nullptr;
}

template
{
current = ptr;
}

template
{
return current->info;
}

template
{

return *this;
}

template
{
return (current == right.current);
}

template
{ return (current != right.current);
}

template
{
public:

void initializeList();
//Initialize the list to an empty state.
//Postcondition: first = nullptr, last = nullptr, count = 0;

bool isEmptyList() const;
//Function to determine whether the list is empty.
//Postcondition: Returns true if the list is empty,
// otherwise it returns false.

void print() const;
//Function to output the data contained in each node.
//Postcondition: none

int length() const;
//Function to return the number of nodes in the list.
//Postcondition: The value of count is returned.

void destroyList();
//Function to delete all the nodes from the list.
//Postcondition: first = nullptr, last = nullptr, count = 0;

Type front() const;
//Function to return the first element of the list.
//Precondition: The list must exist and must not be
// empty.
//Postcondition: If the list is empty, the program
// terminates; otherwise, the first
// element of the list is returned.

Type back() const;
//Function to return the last element of the list.
//Precondition: The list must exist and must not be
// empty.
//Postcondition: If the list is empty, the program
// terminates; otherwise, the last
// element of the list is returned.

virtual bool search(const Type& searchItem) const = 0;
//Function to determine whether searchItem is in the list.
//Postcondition: Returns true if searchItem is in the
// list, otherwise the value false is
// returned.

virtual void insertFirst(const Type& newItem) = 0;
//Function to insert newItem at the beginning of the list.
//Postcondition: first points to the new list, newItem is
// inserted at the beginning of the list,
// last points to the last node in the list,
// and count is incremented by 1.

virtual void insertLast(const Type& newItem) = 0;
//Function to insert newItem at the end of the list.
//Postcondition: first points to the new list, newItem
// is inserted at the end of the list,
// last points to the last node in the list,
// and count is incremented by 1.

virtual void deleteNode(const Type& deleteItem) = 0;
//Function to delete deleteItem from the list.
//Postcondition: If found, the node containing
// deleteItem is deleted from the list.
// first points to the first node, last
// points to the last node of the updated
// list, and count is decremented by 1.

//Function to return an iterator at the begining of the
//Postcondition: Returns an iterator such that current is
// set to first.

//Function to return an iterator one element past the
//last element of the linked list.
//Postcondition: Returns an iterator such that current is
// set to nullptr.

//default constructor
//Initializes the list to an empty state.
//Postcondition: first = nullptr, last = nullptr, count = 0;

//copy constructor

//destructor
//Deletes all the nodes from the list.
//Postcondition: The list object is destroyed.

protected:
int count; //variable to store the number of
//elements in the list
nodeType *first; //pointer to the first node of the list
nodeType *last; //pointer to the last node of the list

private:
//Function to make a copy of otherList.
//Postcondition: A copy of otherList is created and
// assigned to this list.
};

template
{
return(first == nullptr);
}

template
{
first = nullptr;
last = nullptr;
count = 0;
}

template
{
nodeType *temp; //pointer to deallocate the memory
//occupied by the node
while (first != nullptr) //while there are nodes in the list
{
temp = first; //set temp to the current node
delete temp; //deallocate the memory occupied by temp
}
last = nullptr; //initialize last to nullptr; first has already
//been set to nullptr by the while loop
count = 0;
}

template
{
destroyList(); //if the list has any nodes, delete them
}

template
{
nodeType *current; //pointer to traverse the list

current = first; //set current so that it points to
//the first node
while (current != nullptr) //while more data to print
{
cout << current->info << ” “;
}
}//end print

template
{
return count;
} //end length

template
{
assert(first != nullptr);

return first->info; //return the info of the first node
}//end front

template
{
assert(last != nullptr);

return last->info; //return the info of the last node
}//end back

template
{

return temp;
}

template
{

return temp;
}

template
{
nodeType *newNode; //pointer to create a node
nodeType *current; //pointer to traverse the list

if (first != nullptr) //if the list is nonempty, make it empty
destroyList();

if (otherList.first == nullptr) //otherList is empty
{
first = nullptr;
last = nullptr;
count = 0;
}
else
{
current = otherList.first; //current points to the
//list to be copied
count = otherList.count;

//copy the first node
first = new nodeType; //create the node

first->info = current->info; //copy the info
//the node to nullptr
last = first; //make last point to the
//first node
current = current->link; //make current point to
//the next node

//copy the remaining list
while (current != nullptr)
{
newNode = new nodeType; //create a node
newNode->info = current->info; //copy the info
//newNode to nullptr
last->link = newNode; //attach newNode after last
last = newNode; //make last point to
//the actual last node
current = current->link; //make current point
//to the next node
}//end while
}//end else
}//end copyList

template
{
destroyList();
}//end destructor

template
{
first = nullptr;
copyList(otherList);
}//end copy constructor

template
{
if (this != &otherList) //avoid self-copy
{
copyList(otherList);
}//end else

return *this;
}

#endif

#include
#include

using namespace std;

template
{
public:

bool isEmptyQueue() const;
//Function to determine whether the queue is empty.
//Postcondition: Returns true if the queue is empty,
// otherwise returns false.

bool isFullQueue() const;
//Function to determine whether the queue is full.
//Postcondition: Returns true if the queue is full,
// otherwise returns false.

void initializeQueue();
//Function to initialize the queue to an empty state.
//Postcondition: queueFront = nullptr; queueRear = nullptr

Type front() const;
//Function to return the first element of the queue.
//Precondition: The queue exists and is not empty.
//Postcondition: If the queue is empty, the program
// terminates; otherwise, the first
// element of the queue is returned.

Type back() const;
//Function to return the last element of the queue.
//Precondition: The queue exists and is not empty.
//Postcondition: If the queue is empty, the program
// terminates; otherwise, the last
// element of the queue is returned.

//Function to add queueElement to the queue.
//Precondition: The queue exists and is not full.
//Postcondition: The queue is changed and queueElement
// is added to the queue.

void deleteQueue();
//Function to remove the first element of the queue.
//Precondition: The queue exists and is not empty.
//Postcondition: The queue is changed and the first
// element is removed from the queue.

//Default constructor

//Copy constructor

//Destructor

private:
nodeType *queueFront; //pointer to the front of
//the queue
nodeType *queueRear; //pointer to the rear of
//the queue
};

//Default constructor
template
{
queueFront = nullptr; //set front to nullptr
queueRear = nullptr; //set rear to nullptr
} //end default constructor

template
{
return(queueFront == nullptr);
} //end

template
{
return false;
} //end isFullQueue

template
{
nodeType *temp;

while (queueFront!= nullptr) //while there are elements left
//in the queue
{
temp = queueFront; //set temp to point to the
//current node
//the next node
delete temp; //deallocate memory occupied by temp
}

queueRear = nullptr; //set rear to nullptr
} //end initializeQueue

template
{
nodeType *newNode;

newNode = new nodeType; //create the node

newNode->info = newElement; //store the info

if (queueFront == nullptr) //if initially the queue is empty
{
queueFront = newNode;
queueRear = newNode;
}
else //add newNode at the end
{
}

template
{
assert(queueFront != nullptr);
return queueFront->info;
} //end front

template
{
assert(queueRear!= nullptr);
return queueRear->info;
} //end back

template
{
nodeType *temp;

if (!isEmptyQueue())
{
temp = queueFront; //make temp point to the
//first node

delete temp; //delete the first node

if (queueFront == nullptr) //if after deletion the
//queue is empty
queueRear = nullptr; //set queueRear to nullptr
}
else
cout << “Cannot remove from an empty queue” << endl;
}//end deleteQueue

//Destructor
template
{
//Write the definition of the destructor
} //end destructor

template
{
//Write the definition of to overload the assignment operator

} //end assignment operator

//copy constructor
template
{
//Write the definition of the copy constructor
}//end copy constructor

#endif

template
{
public:
virtual bool isEmptyQueue() const = 0;
//Function to determine whether the queue is empty.
//Postcondition: Returns true if the queue is empty,
// otherwise returns false.

virtual bool isFullQueue() const = 0;
//Function to determine whether the queue is full.
//Postcondition: Returns true if the queue is full,
// otherwise returns false.

virtual void initializeQueue() = 0;
//Function to initialize the queue to an empty state.
//Postcondition: The queue is empty.

virtual Type front() const = 0;
//Function to return the first element of the queue.
//Precondition: The queue exists and is not empty.
//Postcondition: If the queue is empty, the program
// terminates; otherwise, the first
// element of the queue is returned.

virtual Type back() const = 0;
//Function to return the last element of the queue.
//Precondition: The queue exists and is not empty.
//Postcondition: If the queue is empty, the program
// terminates; otherwise, the last
// element of the queue is returned.

virtual void addQueue(const Type& queueElement) = 0;
//Function to add queueElement to the queue.
//Precondition: The queue exists and is not full.
//Postcondition: The queue is changed and queueElement
// is added to the queue.

virtual void deleteQueue() = 0;
//Function to remove the first element of the queue.
//Precondition: The queue exists and is not empty.
//Postcondition: The queue is changed and the first
// element is removed from the queue.
};

#endif

using namespace std;

template
{
public:
bool search(const Type& searchItem) const;
//Function to determine whether searchItem is in the list.
//Postcondition: Returns true if searchItem is in the
// list, otherwise the value false is
// returned.

void insertFirst(const Type& newItem);
//Function to insert newItem at the beginning of the list.
//Postcondition: first points to the new list, newItem is
// inserted at the beginning of the list,
// last points to the last node in the
// list, and count is incremented by 1.

void insertLast(const Type& newItem);
//Function to insert newItem at the end of the list.
//Postcondition: first points to the new list, newItem
// is inserted at the end of the list,
// last points to the last node in the
// list, and count is incremented by 1.

void deleteNode(const Type& deleteItem);
//Function to delete deleteItem from the list.
//Postcondition: If found, the node containing
// deleteItem is deleted from the list.
// first points to the first node, last
// points to the last node of the updated
// list, and count is decremented by 1.
};

template
search(const Type& searchItem) const
{
nodeType *current; //pointer to traverse the list
bool found = false;

current = first; //set current to point to the first
//node in the list

while (current != nullptr && !found) //search the list
if (current->info == searchItem) //searchItem is found
found = true;
else
current = current->link; //make current point to
//the next node
return found;
}//end search

template
{
nodeType *newNode; //pointer to create the new node

newNode = new nodeType; //create the new node

newNode->info = newItem; //store the new item in the node
newNode->link = first; //insert newNode before first
first = newNode; //make first point to the
//actual first node
count++; //increment count

if (last == nullptr) //if the list was empty, newNode is also
//the last node in the list
last = newNode;
}//end insertFirst

template
{
nodeType *newNode; //pointer to create the new node

newNode = new nodeType; //create the new node

newNode->info = newItem; //store the new item in the node
//to nullptr

if (first == nullptr) //if the list is empty, newNode is
//both the first and last node
{
first = newNode;
last = newNode;
count++; //increment count
}
else //the list is not empty, insert newNode after last
{
last->link = newNode; //insert newNode after last
last = newNode; //make last point to the actual
//last node in the list
count++; //increment count
}
}//end insertLast

template
{
nodeType *current; //pointer to traverse the list
nodeType *trailCurrent; //pointer just before current
bool found;

if (first == nullptr) //Case 1; the list is empty.
cout << “Cannot delete from an empty list.”
<< endl;
else
{
if (first->info == deleteItem) //Case 2
{
current = first;
count–;
if (first == nullptr) //the list has only one node
last = nullptr;
delete current;
}
else //search the list for the node with the given info
{
found = false;
trailCurrent = first; //set trailCurrent to point
//to the first node
current = first->link; //set current to point to
//the second node

while (current != nullptr && !found)
{
if (current->info != deleteItem)
{
trailCurrent = current;
}
else
found = true;
}//end while

if (found) //Case 3; if found, delete the node
{
count–;

if (last == current) //node to be deleted
//was the last node
last = trailCurrent; //update the value
//of last
delete current; //delete the node from the list
}
else
cout << “The item to be deleted is not in ”
<< “the list.” << endl;
}//end else
}//end else
}//end deleteNode

#endif