asked on
ASKER
ASKER
ASKER
ASKER
#include <iostream>
#include <stdexcept>
using namespace std;
template <typename T>
class node
{
private:
node( const T& x, node* p = NULL )
{
data = x;
next = p;
}
T data;
node* next;
template<typename S> friend class cQueue;
};
template <typename T>
class cQueue
{
public:
cQueue()
{
last = NULL;
count = 0;
}
cQueue( const cQueue& q )
{
copyQueue(q);
}
virtual ~cQueue()
{
deleteQueue();
}
cQueue& operator= ( const cQueue& q )
{
if ( this != &q )
{
deleteQueue();
copyQueue( q );
}
return *this;
}
size_t size() const
{
return count;
}
void insert( const T& v ) // insert an value at the end of the queue
{
if(last == NULL)
{
node<T>* last;
//last = new node<T>*;
last->next = last;
}
else if(v > last->data)
{
node<T>* node2 = new node<T>(v,last->next);
last->next = node2;
last = node2;
}
else
{
node<T>* temp;
temp = last;
while (v > temp->next->data)
{
temp = temp->next;
}
node<T>* temp2 = new node<T> (v, temp->next);
temp->next = temp2;
}
}
T remove() // remove the front item from the queue
{
return last->data;
}
const T& front() const // return a reference to the front item
{
return front();
}
void print( ostream& os = cout ) const // print the contents of the list
{
node<T>* temp = last->next;
while(temp != last)
{
cout<< temp->data << " ";
temp = temp->next;
}
cout<< temp->data << endl;
}
private:
void deleteQueue()
{
if ( last != NULL )
{
node<T>* tmp = last->next;
while ( tmp != last )
{
node<T>* doomed = tmp;
tmp = tmp->next;
delete doomed;
}
last = NULL;
count = 0;
delete tmp;
}
}
void copyQueue( const cQueue& q )
{
last = NULL;
count = 0;
if ( q.last != NULL )
{
node<T>* tmp = q.last->next;
for ( size_t i = 0; i < q.count; i++ )
{
insert( tmp->data );
tmp = tmp->next;
}
}
count = q.count;
}
node<T>* last;
size_t count;
};
template <typename T>
ostream& operator<< ( ostream& os, const cQueue<T>& q )
{
q.print( os );
return os;
}
template <typename T>
void passByValue( cQueue<T> q )
{
q.insert( 40 );
cout << "queue inside passByValue: " << q << endl;
}
int main()
{
{
cQueue<int> q;
q.insert(10);
q.insert(20);
q.insert(30);
cout << "initial queue: " << q << endl;
passByValue( q );
cout << "queue after call to passByValue: " << q << endl;
cout << "front item: " << q.front() << endl;
q.remove();
cout << "front item removed: " << q << endl;
}
}
if(last == NULL)
{
node<T>* last; // last not same as class member last; suggest name change
//last = new node<T>*;
last->next = last; // confusing - which last is local vs class member
}
The local last is not initialized. The class member last is NULL. So, whatever your intention was, neither will work. To make your intention clearer, do not use same name for local variable as for class member.ASKER
ASKER
ASKER
ASKER
ASKER
#include <iostream>
#include <stdexcept>
using namespace std;
template <typename T>
class node
{
private:
node( const T& x, node* p = NULL )
{
data = x;
next = p;
}
T data;
node* next;
template<typename S> friend class cQueue;
};
template <typename T>
class cQueue
{
public:
cQueue() // default constructor
{
last = NULL;
count = 0;
}
cQueue( const cQueue& q ) // copy constructor
{
copyQueue(q);
}
virtual ~cQueue() // queue destructor
{
deleteQueue();
}
cQueue& operator= ( const cQueue& q ) // overloaded assignment operator
{
if ( this != &q )
{
deleteQueue();
copyQueue( q );
}
return *this;
}
size_t size() const // return the size of the queue
{
return count;
}
void insert( const T& v ) // insert an value at the end of the queue
{
if (! last)
{
last = new node<T>(v, NULL);
}
else
{
node<T>* first;
first = last->next;
node<T>* temp;
temp = new node<T>(v, first);
last = last->next;
}
}
T remove() // remove the front item from the queue
{
node<T>* first;
first = last->next;
delete first;
return last->data;
}
const T& front() const // return a reference to the front item
{
return last->data;
}
void print( ostream& os = cout ) const // print the contents of the list
{
node<T>* temp = last->next;
while(temp != last->next)
{
cout<< temp->data << " ";
temp = temp->next;
}
cout<< temp->data << endl;
}
private:
void deleteQueue() // delete nodes in "this" queue
{
if ( last != NULL )
{
node<T>* tmp = last->next;
while ( tmp != last )
{
node<T>* doomed = tmp;
tmp = tmp->next;
delete doomed;
}
last = NULL;
count = 0;
delete tmp;
}
}
void copyQueue( const cQueue& q ) // copy q queue into "this" queue ("this" queue must be empty)
{
last = NULL;
count = 0;
if ( q.last != NULL )
{
node<T>* tmp = q.last->next;
for ( size_t i = 0; i < q.count; i++ )
{
insert( tmp->data );
tmp = tmp->next;
}
}
count = q.count;
}
node<T>* last; // a pointer to the last node in the list
size_t count; // queue length
};
template <typename T> // overloaded ostream operator<<
ostream& operator<< ( ostream& os, const cQueue<T>& q )
{
q.print( os );
return os;
}
template <typename T>
void passByValue( cQueue<T> q )
{
q.insert( 40 );
cout << "queue inside passByValue: " << q << endl;
}
int main()
{
{
cQueue<int> q;
q.insert(10);
q.insert(20);
q.insert(30);
cout << "initial queue: " << q << endl;
passByValue( q );
cout << "queue after call to passByValue: " << q << endl;
cout << "front item: " << q.front() << endl;
q.remove();
cout << "front item removed: " << q << endl;
}
}
ASKER
ASKER
C++ is an intermediate-level general-purpose programming language, not to be confused with C or C#. It was developed as a set of extensions to the C programming language to improve type-safety and add support for automatic resource management, object-orientation, generic programming, and exception handling, among other features.
TRUSTED BY
https://www.experts-exchange.com/questions/27039390/Help-on-insert-function.html
and
https://www.experts-exchange.com/questions/27034354/Insert-Remove-and-Print-functions.html