我在一些家庭作业中遇到了一个奇怪的错误,这个错误使我制作了一个带有链表的堆栈。我的程序中的所有函数都可以正常工作,即使在没有节点的情况下,或者在删除一些节点之后也是如此。但是当我创建节点并将它们全部删除所以我回到零时,每个函数都会导致崩溃。我已经尝试过研究这个问题了,但是我发现的解决方案看起来几乎和我已经得到的解决方案完全相同,所以显然有一些我不会看到的关键问题。
这是节点删除功能(我怀疑这是所有这一切的罪魁祸首)
void remove(node** root)
{
node* temp = *root;
node* previous = 0;
if(*root)
{
while((*root)->next)
{
previous = *root;
*root = (*root)->next;
}
delete *root;
*root = temp;
if(previous)
{
previous->next = 0;
}
}
else
{
std::cout<<"cannot delete items from empty list\n";
}
}
这是节点插入功能
void insert(node** root)
{
node* temp = *root;
if(*root)
{
while((*root)->next)
{
(*root) = (*root)->next;
}
(*root)->next = new node;
(*root)->next->data = getnum();
(*root)->next->next = 0;
*root = temp;
}
else
{
(*root) = new node;
(*root)->data = getnum();
(*root)->next = 0;
}
}
我很确定这个问题出现在我链接的代码中,但是如果不是这样的话,这里是完整作业的一个pastebin http://pastebin.com/AWtG4qjD
答案 0 :(得分:5)
remove
实现不正确。假设列表中有一个元素。
在这种情况下,执行delete *root;
后,temp将指向“不存在的内存”
不过你正在做的是*root = temp;
这样你就可以让root指向无效的节点。
这会导致以后出现奇怪的行为
使您的实现正确的可能方法是:
void remove(node** root)
{
//TODO: your code here
node* temp = *root;
node* previous = 0;
if(*root)
{
while((*root)->next)
{
previous = *root;
*root = (*root)->next;
}
delete *root;
if(previous)
{
*root = temp;
previous->next = 0;
}
else {
*root = NULL;
}
}
else
{
std::cout<<"cannot delete items from empty list\n";
}
}
但我不建议你用root指针迭代列表。定义一些迭代器并用它来查找结尾而不是改变* root