我正在编写一个将堆栈实现为链接列表的程序。该程序符合,但当我运行它时,它崩溃了。我运行调试器,当它进入Pop()函数并进入行" topPtr = topPtr-> next"时,表示未处理的异常。我想知道是否有人注意到那里导致了这个错误。我附上了主要部分和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);
}
答案 0 :(得分: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.
}
///...
}