Kürzlich habe ich versucht, Fortsetzung mit Vorlagen zu implementieren. Hier führenProbleme mit der Implementierung von Deque mit Vorlagen
#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()
{
}
einige Code dann zu prüfen, ob es
int main(){
deque<int> qq(1);
qq.push_front(2);
qq.push_front(3);
qq.print_in_order();
return 0;
}
Dieser Code soll arbeitet nicht kompilieren. Ich habe versucht, nach ähnlichen Projekten oder Bugs zu suchen und konnte nichts Nützliches finden. Daher wäre es großartig, wenn jemand erklären könnte, was falsch läuft. Die meisten Fehler sind gleich. Zum Beispiel ist es nicht erlaubt, back()
oder front()
zu verwenden, weil sie keine Funktionen und keine statischen Mitglieder sind. Oder back()
und front()
als Mitglieder der Vorlage der Klasse können nicht den Typ der Funktion erhalten. Hoffe jemand kann helfen.
"Dieser Code möchte nicht kompilieren" - bitte fügen Sie die Fehler ein. Auch - das ist ** weit ** von * Minimal * Beispiel – Fureeish
Btw - auch ohne die Fehler kann ich sehen, dass Sie doppelte Deklarationen haben ... in 'private' haben Sie' Node * front', was ein Zeiger ist, und in 'public' haben Sie eine Methode namens' front'. Sie können keine doppelten Namen haben, ohne sich mit Überladung zu beschäftigen, was in diesem Fall nicht –
Fureeish
ist. Dies ist eine doppelt verknüpfte Liste. Wenn Sie einen neuen Knoten in eine doppelt verknüpfte Liste einfügen, haben Sie 4 zu aktualisierende Links. Sie aktualisieren nur 2. Darüber hinaus scheinen Ihre vorderen und hinteren Zeiger nie auf dieselbe verknüpfte Liste zu verweisen. –