2015-12-02 4 views
1

Я пишу программу, которая реализует стеки как связанные списки. Программа соответствует, но когда я запускаю ее, она падает. Я запустил отладчик и сказал необработанное исключение, когда оно попадает внутрь функции Pop() и в строку «topPtr = topPtr-> next». Мне было интересно, заметил ли кто-нибудь что-то там, которое вызывает эту ошибку. Я прикрепил часть основной и поп-функции, которые, как я полагаю, пострадали. спасибоC++ Pop Функция Связанный список

template<class ItemType> 
struct NodeType 
{ 
    ItemType info; 
    NodeType* next; 
}; 

template<class ItemType> 
class Stack 
{ 
private: 
    int stacklength; 
    NodeType<ItemType>* topPtr; // It points to a singly-linked list 
public: 
    void Pop(ItemType &x); 

template<class ItemType> 
void Stack<ItemType>::Pop(ItemType &x) 
{ 
    NodeType<ItemType>* tempPtr; 
    tempPtr = topPtr; 
    topPtr = topPtr->next; 
    delete tempPtr; 
    stacklength--; 
} 

int main() 
{ 
Stack <int> IntStack; 
int x; 
IntStack.Pop(x); 
} 
+1

Это произойдет, если 'topPtr' является' nullptr' или неинициализирован. Итак, 1: вам нужно убедиться, что вы инициализируете 'topPtr = nullptr;' в конструкторе и 2: вам нужно проверить глубину стека на 'Pop' (нельзя вытащить из пустого стека!). – crashmstr

+0

'topPtr' не инициализируется! – simpel01

+0

Что вы ожидаете от 'topPtr'? – immibis

ответ

0

Во-первых, вы не инициализируете свои указатели.

template<class ItemType> 
struct NodeType 
{ 
    //... 
    NodeType() : next(nullptr) {} ///Initialize next so we can check for null 
}; 

template<class ItemType> 
class Stack 
{ 
public: 
    Stack() : topPtr(nullptr), stacklength(0) { } ///initialize 
    //... 

Тогда в вашем Pop, вам нужно проверить для пустого стека (вы не можете выскочить, если нет элементов).

template<class ItemType> 
void Stack<ItemType>::Pop(ItemType &x) 
{ 
    if (!topPtr) 
    { 
     //Here, we need to decide how to handle this. 
     //One way would be to throw an exception, 
     //another way would be to change the method signature 
     //and return a bool. 
    } 
    ///... 
}