Reputation: 7
Recently I have tried to implement sequel using templates. Here is result
#pragma once
#include <iostream>
using namespace std;
template<typename Type>
struct Node {
Node();
Node<Type>* next = NULL;
Node<Type>* prev = NULL;
Type data;
};
template<typename Type>
class deque{
private:
Node<Type>* front = NULL;
Node<Type>* back = NULL;
public:
deque(Type key);
~deque();
Node<Type>* back();
Node<Type>* front();
int size();
bool empty();
void push_front(Type key);
void push_back(Type key);
void pop_front();
void pop_back();
void print_in_order();
};
template<typename Type>
deque<Type>::deque(Type key)
{
if (front != NULL || back != NULL)
return
else
{
front = new Node<Type>();
front->data = key;
prev = front;
}
}
template<typename Type>
deque<Type>::~deque()
{
Node<Type>* delPtr;
while (front->prev != NULL)
{
delPtr = front;
cout << "Deleted " << front->data<<endl;
front = front->prev;
delete delPtr;
}
back = NULL;
delete front;
}
template<typename Type>
Node<Type>* deque<Type>::back()
{
if(back!= NULL)
return back;
else
return NULL
}
template<class Type>
Node<Type>* deque<Type>::front()
{
return front;
}
template<typename Type>
int deque<Type>::size()
{
int counter = 0;
Node<Type>* temp = front;
while (temp->back != NULL)
{
counter++;
temp = temp->back;
}
return counter;
}
template<typename Type>
bool deque<Type>::empty()
{
if (front == NULL && back == NULL)
return true;
else
return false;
}
template<typename Type>
void deque<Type>::push_front(Type key)
{
Node<Type>* temp = new Node<Type>();
temp->data = key;
temp->prev = front;
front->next = temp;
front = temp;
}
template<typename Type>
void deque<Type>::push_back(Type key)
{
Node<Type>* temp = new Node<Type>();
temp->data = key;
temp->next = back;
back->prev = temp;
back = temp;
}
template<typename Type>
inline void deque<Type>::pop_front()
{
if (front != NULL) {
Node<Type>* delPtr = front;
front = front->prev;
front->next = NULL;
delete delPtr;
}
else
cout << "There is no front in empty deque" << endl;
}
template<typename Type>
void deque<Type>::pop_back()
{
if (back != NULL) {
Node<Type>* delPtr = back;
back = back->next;
back->prev = NULL;
delete delPtr;
}
else
cout << "There is no back in empty deque " << endl;
}
template<typename Type>
void deque<Type>::print_in_order()
{
if (front == NULL)
return;
Node<Type> temp = front;
while (temp->prev != NULL) {
cout << temp->data << " ";
temp = temp->prev;
}
cout << endl;
}
template<typename Type>
inline Node<Type>::Node()
{
}
Then some code to check whether it is working
int main(){
deque<int> qq(1);
qq.push_front(2);
qq.push_front(3);
qq.print_in_order();
return 0;
}
This code doesn't want to compile. I have tried looking for similar project or bugs and couldn't find anything useful. Therefore it would be great if someone could explain what is going wrong.
Most of errors are the same. For instance it is not allowed to use back()
or front()
because they are not functions and not a static members. Or back()
and front()
as members of template of class can't receive type of function. Hope someone can help.
Upvotes: 0
Views: 219
Reputation: 174
There are a conflict between
Node<Type>* front = NULL;
Node<Type>* back = NULL;
and
Node<Type>* back();
Node<Type>* front();
So first of all change Node<Type>* front = NULL;
to Node<Type>* m_front = NULL;
and the same to back
. There are another errors on your code, for example
Node<Type> temp = front;
have to be
Node<Type>* temp = front;
Finally, you can see the code without compilation errors on ideone
Good Lucky!
Upvotes: 2