我目前正在编写正在使用链表实现的堆栈。我收到这个错误:
Unhandled exception at 0x75249617 in STACK_LinkedList.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x002ee8f8.
我相信它可能来自我的push()
或pop()
函数。我找不到我的错误。我对链表很新,所以我发现错误有点困难。
这是我的push()
功能:
// Adds an item to the top of the stack
template <class S>
void Stack<S>::push(const S & e)
{
NodePointer temp = new Node(e);
if ( isEmpty() )
{
theTop = theFront = temp;
}
else
{
// Whatever is after top is stored in temp to keep track of it
theTop->next = temp;
// TheTop is stored in temp
theTop = temp;
delete temp;
}
}
这是我的pop()
功能:
//Takes the item off the top of the stack
template <class S>
void Stack<S>::pop()
{
if ( !isEmpty() )
{
//temp node is set equal to the front
NodePointer temp = theFront;
//Holds the second to last node in the linked list
NodePointer pred;
//loops through until the node after temp is 0
while (temp->next != 0)
{
//sets the second to last as temp
pred = temp ;
//basically "increments" temp to the next node
temp = temp->next ;
}
//sets temp equal to the top
temp = theTop;
//the top is then set to its predecessor
theTop = pred;
//deletes what was known as the top
delete temp;
}
else
cout << "STACK IS EMPTY" << endl;
}
非常感谢!我相信我的大多数逻辑是正确的。我只是错过了一些小事。如果是其他的请告诉我,我会发布该代码。
答案 0 :(得分:2)
您的推送功能正在删除“temp”。但是,temp指向刚刚添加到列表中的数据。如果在指针上调用delete,则不是丢弃指针,而是删除它指向的内存!在推送中删除你的删除语句并首先测试(没有弹出)。我没有查看你的pop函数,但是在测试pop()之后我将把它作为练习让你检查错误。
-Dan8080
答案 1 :(得分:2)
您不应该删除temp
中的push
!这是列表的一部分。因此,当您稍后访问此数据时,您肯定会例外。
其次,您必须在pred
中使用NULL
初始化pop()
,否则如果堆栈仅包含1个项目,您将获得分配给theTop
的未定义值
第三,您应该在pop()
中删除您在push()
中分配的节点。
一般来说,您的方法似乎效率不高。您应该更好地存储指针的其他方式:从堆栈顶部到底部项目。这样,您就不需要遍历每个pop()
上的整个堆栈。你的代码将是这样的:
void push(data)
{
allocate new top
new top's next is the old top
store new top in the class
}
void pop()
{
if empty, ERROR;
new top = old top's next
deallocate old top
}
请注意,您根本不需要theFront
。