6

我在一些作业中遇到了一个奇怪的错误,它让我用链表制作了一个堆栈。我的程序中的所有功能都可以正常工作,即使在我没有节点的开始,或者在删除一些节点之后也是如此。但是当我创建节点并将它们全部删除以便我回到零时,每个函数都会导致崩溃。我已经尝试研究这个问题,但我发现的解决方案看起来几乎与我已经得到的相同,所以显然我没有看到一些关键的东西。

这是节点删除功能(我怀疑是这一切的罪魁祸首)

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

4

1 回答 1

4

remove实现不正确。假设列表有一个元素。在这种情况下, temp 将在您执行后指向“不存在的内存” delete *root; 但是您正在做的是*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

于 2012-07-20T18:03:36.830 回答