递归删除链表,使用new分配内存

时间:2014-12-23 01:49:21

标签: c++ linked-list

void DeleteList(node** Head)
{
  if(*Head==NULL)
    return;
  node* current=*Head;
  delete[] current;
  current=NULL;
  DeleteList(&((*Head)->next));
}

程序因分段错误而崩溃。

2 个答案:

答案 0 :(得分:3)

您需要在(*Head)->next之前将delete[] current复制到另一个变量中。否则,您尝试访问已删除的节点中的next

void DeleteList(node** Head)
{
  if(*Head==NULL) {
    return;
  }
  node* current=*Head;
  node* tail = current->next;
  delete current;
  DeleteList(&tail);
}

另外,我怀疑你应该使用delete[]current可能只是一个节点,而不是一个节点数组。并且没有必要设置current = NULL;这是一个局部变量,当函数结束时它就会消失,之后你从未使用它,所以它包含的内容并不重要。

另一种解决方案是将DeleteList(&((*Head)->next));移至delete current;之前。

我也不确定为什么要使用指针指针调用此函数。当您想要修改调用者的指针时,通常会这样做。但你从来没有这样做过。但也许你是为了与链接列表库的其余部分保持一致而做到这一点,那很好。

答案 1 :(得分:1)

以下是您必须要做的事情。删除后访问内存是未定义的行为( as Barmar'

void deleteList(list_link* item)
{
    while (item)
    {
        list_link* old = item;
        item = item->next;
        delete old;
    }
}