Answered! Replace the circular linked list in the attached Josephus Problem solution with a queue. (Data Structures C++)…

Replace the circular linked list in the attached Josephus Problem solution with a queue. (Data Structures C++)

UnorderedCircularLinkedList.h

Don't use plagiarized sources. Get Your Custom Essay on
Answered! Replace the circular linked list in the attached Josephus Problem solution with a queue. (Data Structures C++)…
GET AN ESSAY WRITTEN FOR YOU FROM AS LOW AS $13/PAGE
Order Essay

#pragma once

//***********************************************************
// Author: D.S. Malik
//
// This class specifies the members to implement the basic
// properties of an unordered circularlinked list. This class is
// derived from the class circularLinkedListType.
//***********************************************************

#include “circularLinkedList.h”

using namespace std;

template <class Type>
class unorderedCircularLinkedList: public circularLinkedListType<Type>
{
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, 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, 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 <class Type>
bool unorderedCircularLinkedList<Type>::search(const Type& searchItem) const
{
nodeType<Type> *current; //pointer to traverse the list
bool found = first != NULL && last->info == searchItem;

current = first; //set current to point to the first node in the list
while (current != last && !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 <class Type>
void unorderedCircularLinkedList<Type>::insertFirst(const Type& newItem)
{
nodeType<Type> *newNode; //pointer to create the new node
newNode = new nodeType<Type>; //create the new node
newNode->info = newItem;    //store the new item in the node
if (first == NULL)
{

first = newNode;
last = first;
last->link = first;
}
else
{
last->link = newNode;       //make last point to new node
newNode->link = first;      //make new node point to first
first = newNode;            //make first point to new node
}
count++;                    //increment count
}//end insertFirst

template <class Type>
void unorderedCircularLinkedList<Type>::insertLast(const Type& newItem)
{
nodeType<Type> *newNode; //pointer to create the new node
newNode = new nodeType<Type>; //create the new node
newNode->info = newItem; //store the new item in the node
if (first == NULL) //if the list is empty, newNode is both the first and last node
{
first = newNode;
last = first;
last->link = first;
}
else    //the list is not empty, insert newNode after last
{
newNode->link = last->link;
last->link = newNode; //insert newNode after last
last = newNode;
}
count++;
}//end insertLast

template <class Type>
void unorderedCircularLinkedList<Type>::deleteNode(const Type& deleteItem)
{
nodeType<Type> *current; //pointer to traverse the list
nodeType<Type> *trailCurrent; //pointer just before current
bool found;

if (first == NULL)    //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->link == first) //the list has only one node
{
first = NULL;
last = NULL;
}
else if (first->link == last) //the list has two nodes
{
first = first->link;
first->link = first;
last = first;
}
else
{
first = first->link;
last->link = first;
}
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 != first && !found)
if (current->info != deleteItem)
{
trailCurrent = current;
current = current-> link;
}
else
found = true;
if (found) //Case 3; if found, delete the node
{
trailCurrent->link = current->link;
if (current == last)
last = trailCurrent;

count–;
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

circularLinkedList.h

#pragma once
#include <iostream>
#include <cassert>

using namespace std;

//Definition of the node

template <class Type>
struct nodeType
{
Type info;
nodeType<Type> *link;
};

//***********************************************************
// Author: D.S. Malik
//
// This class specifies the members to implement an iterator
// to a linked list.
//***********************************************************

template <class Type>
class circularLinkedListIterator
{
public:
circularLinkedListIterator();
//Default constructor
//Postcondition: current = NULL;

circularLinkedListIterator(nodeType<Type> *ptr);
//Constructor with a parameter.
//Postcondition: current = ptr;

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

circularLinkedListIterator<Type> operator++();
//Overload the preincrement operator.
//Postcondition: The iterator is advanced to the next node.

bool operator==(const circularLinkedListIterator<Type>& right) const;
//Overload the equality operator.
//Postcondition: Returns true if this iterator is equal to
//    the iterator specified by right, otherwise it returns
//    false.

bool operator!=(const circularLinkedListIterator<Type>& right) const;
//Overload the not equal to operator.
//Postcondition: Returns true if this iterator is not equal to
//    the iterator specified by right, otherwise it returns
//    false.

private:
nodeType<Type> *current; //pointer to point to the current
//node in the linked list
};

template <class Type>
circularLinkedListIterator<Type>::circularLinkedListIterator()
{
current = NULL;
}

template <class Type>
circularLinkedListIterator<Type>::
circularLinkedListIterator(nodeType<Type> *ptr)
{
current = ptr;
}

template <class Type>
Type circularLinkedListIterator<Type>::operator*()
{
return current->info;
}

template <class Type>
circularLinkedListIterator<Type> circularLinkedListIterator<Type>::operator++()
{
current = current->link;
return *this;
}

template <class Type>
bool circularLinkedListIterator<Type>::operator==
(const circularLinkedListIterator<Type>& right) const
{
return (current == right.current);
}

template <class Type>
bool circularLinkedListIterator<Type>::operator!=
(const circularLinkedListIterator<Type>& right) const
{   return (current != right.current);
}

//***********************************************************
// Author: D.S. Malik
//
// This class specifies the members to implement the basic
// properties of a linked list. This is an abstract class.
// We cannot instantiate an object of this class.
//***********************************************************

template <class Type>
class circularLinkedListType
{
public:
const circularLinkedListType<Type>& operator=
(const circularLinkedListType<Type>&);
//Overload the assignment operator.

void initializeList();
//Initialize the list to an empty state.
//Postcondition: first = NULL, last = NULL, 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 = NULL, last = NULL, 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.

circularLinkedListIterator<Type> begin();
//Function to return an iterator at the beginning of the
//linked list.
//Postcondition: Returns an iterator such that current is set
//    to first.

circularLinkedListIterator<Type> end();
//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 NULL.

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

circularLinkedListType(const circularLinkedListType<Type>& otherList);
//copy constructor

~circularLinkedListType();
//destructor
//Deletes all the nodes from the list.
//Postcondition: The list object is destroyed.

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

private:
void copyList(const circularLinkedListType<Type>& otherList);
//Function to make a copy of otherList.
//Postcondition: A copy of otherList is created and assigned
//    to this list.
};

template <class Type>
bool circularLinkedListType<Type>::isEmptyList() const
{
return first == NULL;
}

template <class Type>
circularLinkedListType<Type>::circularLinkedListType() //default constructor
{
first = NULL;
last = NULL;
count = 0;
}

template <class Type>
void circularLinkedListType<Type>::destroyList()
{
nodeType<Type> *temp;   //pointer to deallocate the memory
//occupied by the node
while (first != last)   //while there are nodes in the list
{
temp = first;        //set temp to the current node
first = first->link; //advance first to the next node
delete temp;   //deallocate the memory occupied by temp
}
delete first;
first = NULL;
last = NULL;
count = 0;
}

template <class Type>
void circularLinkedListType<Type>::initializeList()
{
destroyList(); //if the list has any nodes, delete them
}

template <class Type>
void circularLinkedListType<Type>::print() const
{
nodeType<Type> *current; //pointer to traverse the list

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

template <class Type>
int circularLinkedListType<Type>::length() const
{
return count;
} //end length

template <class Type>
Type circularLinkedListType<Type>::front() const
{
assert(first != NULL);
return first->info; //return the info of the first node
}//end front

template <class Type>
Type circularLinkedListType<Type>::back() const
{
assert(last != NULL);
return last->info; //return the info of the last node
}//end back

template <class Type>
circularLinkedListIterator<Type> circularLinkedListType<Type>::begin()
{
circularLinkedListIterator<Type> temp(first);
return temp;
}

template <class Type>
circularLinkedListIterator<Type> circularLinkedListType<Type>::end()
{
circularLinkedListIterator<Type> temp(last);
return temp;
}

template <class Type>
void circularLinkedListType<Type>::copyList
(const circularLinkedListType<Type>& otherList)
{
nodeType<Type> *newNode; //pointer to create a node
nodeType<Type> *current; //pointer to traverse the list

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

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

//copy the first node
first = new nodeType<Type>;   //create the node
first->info = current->info; //copy the info
first->link = first;          //set the link field of the node to itself
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 != otherList.first)
{
newNode = new nodeType<Type>; //create a node
newNode->info = current->info; //copy the info
newNode->link = first;       //set the link of newNode to first
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 <class Type>
circularLinkedListType<Type>::~circularLinkedListType() //destructor
{
destroyList();
}//end destructor

template <class Type>
circularLinkedListType<Type>::circularLinkedListType
(const circularLinkedListType<Type>& otherList)
{
first = NULL;
copyList(otherList);
}//end copy constructor

//overload the assignment operator
template <class Type>
const circularLinkedListType<Type>& circularLinkedListType<Type>::operator=
(const circularLinkedListType<Type>& otherList)
{
if (this != &otherList) //avoid self-copy
{
copyList(otherList);
}//end else
return *this;
}

Source.cpp

//This program tests various operation of a linked list
//34 62 21 90 66 53 88 24 10

#include <ctime>
#include <iostream>
#include <random>
#include “unorderedCircularLinkedList.h”

using namespace std;

void show(unorderedCircularLinkedList<unsigned>& ucl)
{
ucl.print();
cout << endl;
}
void load(unorderedCircularLinkedList<unsigned>& ucl, unsigned howmany = 41)
{
for (unsigned counter = 1; counter <= howmany; counter++)
ucl.insertLast(counter);
}
unorderedCircularLinkedList<unsigned> kill(const unorderedCircularLinkedList<unsigned>& victims, unsigned killinterval = 3)
{
unorderedCircularLinkedList<unsigned> survivors = victims;
unsigned killcount = 1;
circularLinkedListIterator<unsigned> it = survivors.begin();
while (survivors.length() >= killinterval)
{
if (killcount == killinterval)
{
circularLinkedListIterator<unsigned> dit = it;
++it;
killcount = 1;
survivors.deleteNode(*dit);
}
else
{
++it;
++killcount;
}
}
return survivors;
}

int main()
{
unorderedCircularLinkedList<unsigned> victims;

load(victims);
show(victims);
unorderedCircularLinkedList<unsigned> survivors = kill(victims);
show(survivors);
system(“pause”);
return 0;
}

Expert Answer

 Implementation using Queues

import java.io.*;

//Stack—————
class Node<T> {
T value;
Node<T> link;
}

class Stack<T> {
Node<T> top;
public Stack() {
top = null;
}
public void push(T item) {
Node<T> n = new Node<T>();
n.value = item;
n.link = top;
top = n;
}
public T pop() {
T item;
item = top.value;
Node<T> n = top;
n = null;
top = top.link;
return item;
}
public void display() {
Node<T> n = top;
System.out.print(“(top)”);
while (n != null) {
System.out.print(” ->” + n.value);
n = n.link;
}
System.out.println();
}
}

// Queue—————————
class Queue<T> {
Node<T> front, rear;
Stack<T> s1 = new Stack<T>();
Stack<T> s2 = new Stack<T>();
public Queue() {
}
public void add(T item) {
while (s2.top != null)
s1.push(s2.pop());
s1.push(item);
rear = s1.top;
while (s1.top != null)
s2.push(s1.pop());
front = s2.top;
}
public T remove() {
T item = s2.pop();
front = s2.top;
return item;
}
public void display() {
Node<T> n = s2.top;
System.out.print(“(front)”);
while (n != null) {
System.out.print(” <-” + n.value);
n = n.link;
}
System.out.println(” <-(rear)”);
}
}

// Josephus Problem——————-
public class Josephus {
public static void main(String[] args) throws IOException {
Queue<Integer> q = new Queue<Integer>();
Queue<Integer> q1 = new Queue<Integer>();
int n, m, i;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println(“Enter no. of members (n) : “);
n = Integer.parseInt(br.readLine());
System.out.println(“Enter the elimination number (m) : “);
m = Integer.parseInt(br.readLine());
for (i = 1; i <= n; i++)
q.add(i);
Node<Integer> node = q.front;
int l, k = 0;
while (k != n – 1) {
for (i = 1; i < m; i++)
q.add(q.remove());
l = q.remove();
q1.add(l);
k++;
}
System.out.println(“Order of elimination is : “);
while (q1.front != null)
System.out.print(q1.remove() + “,”);
System.out.println(“nWinner is : ” + q.remove());
}
}

Still stressed from student homework?
Get quality assistance from academic writers!