【问题标题】:Linked List: Deleting nodes with chosen data链表:删除具有所选数据的节点
【发布时间】:2015-05-21 18:19:37
【问题描述】:

我在从列表中删除所选节点时遇到问题。任务是删除所有包含用户选择的数据的节点并计算它们。例如删除所有包含 3 的节点并计算它们。函数应返回带有已删除节点数的整数。我的函数弹出节点代码和弹出所有节点(包括特定数据)的代码在这里。我使用 Visual Studio 2012 并且调试说一些指针指向空间。内存读取失败。有什么问题?

void pop(Node *  head, Node *  pointer) //delete node with given pointer
{
    Node * p = head;
    if (pointer == head)
    {
        head = p->next;
        delete p;
    }
    else
    {
        while( p->next != pointer )
        {
            p = p->next;
        }
        p->next = pointer->next;
        delete pointer;
    }
}

int pop_all(Node *  head, float data_out) //delete all nodes with proper data
{
  Node * p = head;
  int counter = 0;
  while(p->next != NULL)
  {
    if (p->data == data_out)
    {
        pop(head,p);
        counter++;  
    }
    else
    {
        p = p->next;
    }

  }

  return counter;
}

【问题讨论】:

  • 很确定这应该被标记为 C.
  • 您的代码第一次无法正确检查包含 1 个元素 (p->next == NULL) 的列表。
  • 请注意,在通过pop_all() 弹出一个元素后,您需要一个p->next,因为您所在的完全相同的节点现在已被删除。
  • 此外,您正在直接与浮点值进行比较。考虑使用 epsilon 或其他数据类型,因为直接浮点比较通常不会像您认为的那样工作。
  • 我没有。这是帖子错误。

标签: c++


【解决方案1】:

首先是一个问题:为什么是自制列表而不是 std::list。

然后是建设性的批评:pop 函数的签名错误。如果被删除的节点如果是列表的第一个节点,那么函数就没有办法告诉调用者头部发生了变化。通常我是这样实现的:

void pop(Node **head, Node *pointer)
{
    for ( ; *head ; head = &((*head)->>next)
        if (*head == pointer)
        {
            Node *temp = *head ;
            *head = temp->next ;
            delete p ;            
        }
}

【讨论】:

  • 谢谢!我试试这个方法。
【解决方案2】:

pop_all() 中,在调用pop(head,p) 之后head != pp 指向记忆你只是deleted。然后在while 循环的顶部,您要求p->next,这是未定义的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2012-01-26
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多