链表:删除带有选定数据的节点

Linked List: Deleting nodes with chosen data

本文关键字:数据 节点 删除 链表      更新时间:2023-10-16

我有问题,从我的列表中删除选定的节点。任务是删除包含用户选择的数据的所有节点并对其进行计数。例如,删除所有包含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;
}

首先有一个问题:为什么是home brew list而不是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 ;            
        }
}

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