The goal of this assignment is to reinforce using linear dat

The goal of this assignment is to reinforce using linear data structures in C++. Specifically, the assignment is to create a dynamic implementation of a deque using the author\'s linked list implementation. The header file for the deque is deque.h.

deque.h file

http://pastebin.com/XeJxSF6r

node2.h

http://pastebin.com/GYVk2DiJ

Solution

Given below is the implementation file deque.template Also a simple test for the implementation is given in main.cpp Please use these 2 files along with your files - node2.h , node2.template, deque.h

To compile the main.cpp

use g++ main.cpp

deque.template


//postcondition: empty deque has been created
template <typename T>
deque<T>::deque()
{
count = 0;
first = last = NULL;
}

// postcondition: all resouroces allocated to the deque
// have been deallocated
template <typename T>
deque<T>::~deque()
{
list_clear(first);
}

// postcondition: newly created deque is a copy of dq
template <typename T>
deque<T>::deque(const deque<T>& dq)
{
first = last = NULL;
*this = dq;
}

// postcondition: current deque is a copy of dq
template <typename T>
deque<T>& deque<T>::operator = (const deque<T>& dq)
{
list_clear(first);
list_copy(dq.first, first, last);
count = dq.count;
return *this;
}


//precondition: deque is not empty
// postcondition: reference to element at front of deque
// has been returned
template <typename T>
T& deque<T>::front()
{
if(empty())
throw \"deque empty\";
return first->data();
}

// precondition: deque is not empty
// postcondition: copy of element at front of deque
// has been returned
template <typename T>
T deque<T>::front() const
{
if(empty())
throw \"deque empty\";
return first->data();

}

// precondition: deque is not empty
// postcondition: reference to element at front of deque
// has been returned
template <typename T>
T& deque<T>::back()
{
if(empty())
throw \"deque empty\";
return last->data();
}

// precondition: deque is not empty
// postcondition: copy of element at back of deque
// has been returned
template <typename T>
T deque<T>::back() const
{
if(empty())
throw \"deque empty\";
return last->data();
}

// postcondition: entry has been inserted at the front
// of the deque
template <typename T>
void deque<T>::push_front (const T& entry)
{
list_head_insert(first, entry);
if(last == NULL)
last = first;
count++;
}

// postcondition: entry has been inserted at the back
// of the deque
template <typename T>
void deque<T>::push_back (const T& entry)


{
if(empty())
push_front(entry);
else
{
list_insert(last, entry);
last = last->link();
count++;
}
}

// precondition: deque is not empty
// postcondition: element at front of deque has been removed
template <typename T>
void deque<T>::pop_front()
{
if(empty())
throw \"deque empty.\";

list_head_remove(first);
if(first == NULL)
last = NULL;
count--;


}

// precondition: deque is not empty
// postcondition: element at back of deque has been removed
template <typename T>
void deque<T>::pop_back()
{
if(empty())
throw \"deque empty.\";
if(size() == 1)
pop_front();
else
{
node<T>* prev = list_locate(first, size()-1);
list_remove(prev);
last = prev;
count--;
}

}

// postcondition: number of elements in deque has been returned
template <typename T>
std::size_t deque<T>::size() const
{
return count;
}

// postcondition: whether deque is empty has been returned
template <typename T>
bool deque<T>::empty() const
{
return count == 0;
}

// postcondition: returned whether 2 deques are equal - equal is defined
// as the deques have the same number of elements &
// corresponding elements are equal
template <typename U>
bool operator == (const deque<U>& dq1, const deque<U>& dq2)
{
if(dq1.size() == dq2.size())
{
node<U>* p = dq1.first, *q = dq2.first;
while(p != NULL)
{
if(p->data() != q->data())
return false;
p = p->link();
q = q->link();
}
return true;
}
else
return false;
}

// postcondition: dq has been display from front to rear on out
template <typename U>
std::ostream& operator<< (std::ostream& out, const deque<U>& dq)
{
node<U> *curr = dq.first;
while(curr != NULL)
{
out << curr->data() << \" \";
curr = curr->link();
}
return out;
}

main.cpp

#include \"deque.h\"
#include <cassert>
#include <iostream>
using namespace std;
int main()
{
deque<int> dq;

assert(dq.size() == 0);
  
dq.push_front(2);
assert(dq.front() == 2);
  
dq.push_front(4);
assert(dq.front() == 4);
  
dq.push_front(6);
assert(dq.front() == 6);
  
  
assert(dq.size() == 3);
  
cout << dq << endl;
  
dq.push_back(8);
assert(dq.back() == 8);
  
dq.push_back(10);
assert(dq.back() == 10);
assert(dq.size() == 5);
  
cout << dq << endl;
  
deque<int> dq2(dq);
assert(dq == dq2);
  
dq2.push_back(12);
assert(!(dq == dq2));
  
dq.pop_front();
assert(dq.front() == 4);
assert(dq.size() == 4);
dq.pop_front();
assert(dq.front() == 2);
assert(dq.size() == 3);
  
dq.pop_back();
assert(dq.back() == 8);
assert(dq.size() == 2);
dq.pop_back();
assert(dq.back() == 2);
assert(dq.front() == 2);
assert(dq.size() == 1);
assert(!dq.empty());
  
dq.pop_front();
assert(dq.size() == 0);
assert(dq.empty());
  
cout << \"all tests passed\" << endl;
  
}

output

6 4 2
6 4 2 8 10
all tests passed

The goal of this assignment is to reinforce using linear data structures in C++. Specifically, the assignment is to create a dynamic implementation of a deque u
The goal of this assignment is to reinforce using linear data structures in C++. Specifically, the assignment is to create a dynamic implementation of a deque u
The goal of this assignment is to reinforce using linear data structures in C++. Specifically, the assignment is to create a dynamic implementation of a deque u
The goal of this assignment is to reinforce using linear data structures in C++. Specifically, the assignment is to create a dynamic implementation of a deque u
The goal of this assignment is to reinforce using linear data structures in C++. Specifically, the assignment is to create a dynamic implementation of a deque u

Get Help Now

Submit a Take Down Notice

Tutor
Tutor: Dr Jack
Most rated tutor on our site