2017-12-02 1 views
0

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.

+4

"Dieser Code möchte nicht kompilieren" - bitte fügen Sie die Fehler ein. Auch - das ist ** weit ** von * Minimal * Beispiel – Fureeish

+4

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

+1

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. –

Antwort

2

Es gibt einen Konflikt zwischen

Node<Type>* front = NULL; 
Node<Type>* back = NULL; 

und

Node<Type>* back(); 
Node<Type>* front(); 

Also zunächst einmal ändern Node<Type>* front = NULL;-Node<Type>* m_front = NULL; und gleich back. Es gibt andere Fehler auf Ihrem Code, zum Beispiel

Node<Type> temp = front; 

haben

Node<Type>* temp = front; 

schließlich sein, können Sie den Code ohne Kompilierungsfehlern auf ideone

Gut Glück sehen!

Verwandte Themen