2016-05-07 17 views
0

Ich habe eine Templates-Stack verknüpfte Liste für eine Aufgabe geschrieben, die ich vervollständigen muss. Wenn ich es ausführe, druckt es das erste Element aus, stürzt dann aber ab. Irgendwelche Ideen, was könnte schief gehen? Ich habe das Gefühl, es könnte die Pop-Funktion sein, aber es ist so einfach, ich bin mir nicht sicher, was überhaupt falsch ist.Templated Stack Verknüpfte Liste

template<typename T> 
struct StackNode 
{ 
    T data; 
StackNode* next; 
StackNode(T t, StackNode* ptr); 
~StackNode(); 
}; 

template <typename T> 
StackNode<T>::StackNode(T t, StackNode* ptr = nullptr) 
:data(t), next(ptr) 
{ 
} 

template <typename T> 
StackNode<T>::~StackNode() 
{ 
delete next; 
} 





template<typename T> 
struct LinkedStack 
{ 

    LinkedStack(); 
    LinkedStack(const StackNode<T> &s); 
    ~LinkedStack(); 
    bool isEmpty(); 
    void push(const T& t); 
    void pop(); 
    T top(); 

    StackNode<T>* head; 
    int numElements; 
}; 

template <typename T> 
LinkedStack<T>::LinkedStack() 
    : head(nullptr), numElements(0) 
{ 
} 

template<typename T> 
LinkedStack<T>::LinkedStack(const StackNode<T> &s) 
    : head(nullptr), numElements(0) 
{ 
    for (auto t = s.head; t; t = t->next) 
     push(t->item); 
} 

template<class T> 
LinkedStack<T>::~LinkedStack() 
{ 
    while (!isEmpty()) 
    { 
     pop(); 
    } 
} 


template<typename T> 
bool LinkedStack<T>::isEmpty() 
{ 
    if (numElements > 0) 
    { 
     return false; 
    } 
    else 
    { 
     return true; 
    } 
} 

template<typename T> 
void LinkedStack<T>::push(const T& t) 
{ 
    head = new StackNode<T>(t, head); 
    numElements++; 
} 

template<typename T> 
void LinkedStack<T>::pop() 
{ 
    if (isEmpty()) 
    { 
     cout << "Stack is empty." << endl; 
    } 
    else 
    { 
     StackNode<T>* oldnode = head; 
     head = head->next; 
     numElements--; 
     delete oldnode; 
    } 
} 

template<typename T> 
T LinkedStack<T>::top() 
{ 
    if (isEmpty()) 
    { 
     cout << "Stack is empty..." << endl; 
    } 
    else 
    { 
     return head->data; 
    } 
} 




int main() 
{ 
    LinkedStack<string> x; 
    x.push("Test"); 
    x.push("One"); 
    x.push("Two"); 
    x.push("Three"); 
    cout << "Now popping all elements of the stack:" << endl; 

    while (x.isEmpty() == false) 
    { 
     cout << x.top() << endl; 
     x.pop(); 
    } 
} 

Antwort

0

Wenn Sie einen Knoten löschen, löschen Sie auch den Knoten verweist er auf:

template <typename T> 
StackNode<T>::~StackNode() 
{ 
    delete next; 
} 

Wenn Sie ein Element Pop, können Sie die gesamte verknüpfte Liste löschen, wie die Löschung von einem Knoten zum anderen propagieren . Der segfault wird nach dem Löschen des letzten Knotens ausgelöst. Ihre Programme versuchen, nullptr zu löschen.

Die Löschanweisung in der pop Funktion ist genug. Keine Notwendigkeit, Stacknode.next zu löschen, da Sie es nicht mit dem neuen Schlüsselwort

zuweisen Ich habe Ihren Code erfolgreich ausgeführt, nachdem das problematische Löschen entfernt wurde.