链接列表:删除具有所选数据的节点

时间:2015-05-21 18:19:37

标签: c++

我从列表中删除所选节点时遇到问题。任务是删除包含用户选择的数据的所有节点并对其进行计数。例如,删除包含3的所有节点并对其进行计数。函数应返回包含已删除节点数的整数。我的函数pop节点和pop包含特定数据的所有节点的代码都在这里。我使用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;
}

2 个答案:

答案 0 :(得分:0)

首先是一个问题:为什么一个家庭啤酒清单而不是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 ;            
        }
}

答案 1 :(得分:0)

pop_all()中,在致电pop(head,p) head != p后,p指向内存delete d。然后在while循环的顶部,您要求p->next,这是未定义的。