【问题标题】:Segmentation fault after trying to delete node from linked list尝试从链表中删除节点后出现分段错误
【发布时间】:2018-03-10 19:48:36
【问题描述】:

我试图传入一个链表,然后删除不是数字的节点。我不断收到分段错误,我不确定我在哪里找到一个不存在的指针。

void clean(node*& start)
    while(start)
        if(*is a number*){
            node* tail = start;
            while (tail->next){
                node* temp = tail->next;
                tail->data = temp->data;
                tail = tail->next;
            }
            if (!tail->next)
                delete tail;
        }
        start= start->next;
    }
}

->next 将节点链接到其余节点。

【问题讨论】:

  • 如果你的意思是你所说的“我试图传入一个链表,然后删除不是数字的节点” - 我看不出你的代码中应该有new 的任何理由;您的代码对于您的意图来说过于复杂
  • 如果tail->next 为NULL,则下一行将取消引用null,就好像它是一个节点并分配给那里的成员
  • 在一张纸上画出节点列表。让一些节点编号和一些不编号,然后按照您的指示通过列表并观察会发生什么。当发现自己被指示做一些愚蠢的事情时,请更改代码以使其不愚蠢。提示:这个while (tail->next) 看起来很傻。
  • 所示逻辑似乎存在严重的、根本性的缺陷。既定目标是“删除不是数字的节点”。逻辑上遵循“如果(是一个数字)”,那么这个节点属于列表,并且该过程应该简单地前进到列表中的下一个节点,就是这样。代码没有这样做,而是继续执行一些我无法破译其目的的令人困惑的循环。这种简单、直接的任务应该只包括对整个列表的一次遍历,跳过不属于的节点。而已。不需要任何嵌套循环。
  • 使用调试器并逐行跟踪您的代码...或使用纸和铅笔。这里有明显的错误,比如当tail 为空时访问tail->nextnode* temp = new node; 行也没有意义。还有更多问题!

标签: c++ linked-list segmentation-fault doubly-linked-list


【解决方案1】:

这段代码有各种各样的错误。内部循环是完全没有必要的,并且在外部循环的每次迭代中更新start 指针基本上是错误的(每次调用clean() 时,调用者都会丢失其列表的head 指针)。

代码应该看起来更像这样:

void clean(node* &start)
{
    node *n = start, *prev = NULL, *next;
    while (n)
    {
        next = n->next;
        if (n->data is not a number)
        {
            if (prev) prev->next = next;
            if (start == n) start = next;
            delete n;
        }
        else
            prev = n;
        n = next;
    }
}

【讨论】:

  • delete n 语句中让指针悬空不是为以后检查添加或附加(错误地)时出现问题的一种设置吗?
  • @M4rc 没有。并且此代码中没有悬空指针,因为在删除节点之前更新了其他受影响的节点
  • 只是在这里检查我的思考过程:如果他使用 start 变量重新填充或插入并尝试迭代列表以寻找 null 结束,通过删除指针,内存是空闲的' d,但该地址仍会存在,因此插入仍会尝试取消引用以遍历列表。当然,我确信这取决于实现。想法?
  • @M4rc 此代码不会删除空指针(无论如何都是安全的)。由于start 是通过引用传递的,因此如果调用者的指针指向一个正在被删除的节点,该函数可以更新它以指向一个新地址。
猜你喜欢
  • 2019-12-05
  • 2017-10-28
  • 2020-04-19
  • 2019-03-03
  • 1970-01-01
  • 2020-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多