在C中递归删除链接列表中的元素

时间:2017-03-13 07:01:37

标签: c list recursion hyperlink destroy

我目前正在通过做老师为我们学习的练习问题进行测试,并且我正在努力解决链接列表中的删除元素。我得到了无限循环,我不太清楚为什么!有人可以告诉我正确的方向吗?我已经制作了一个删除元素而没有递归的方法(在下面发布),并尝试遵循这个指南。但是,我似乎无法让我的递归方法工作。以下是我的代码:

void destroyListRecursive(node *head)
{
    if ( head == NULL)
        return;

    destroyListRecursive(head->next);

    free(head);
}

这是我的无递归函数(我查看其他文章以获得指导,因为我遇到了一些问题,如果有问题请告诉我):

void destroyList (struct node** head)
{
   struct node* current = *head;
   struct node* next;

   while (current != NULL) 
   {
       next = current->next;
       free(current);
       current = next;
   }

   *head = NULL;
}

这是我的列表结构:

typedef struct node
{
    // data field
    int data;

    // the next node in the list
    struct node *next;
} node;

我真的很感激在正确的方向上轻推! :)

2 个答案:

答案 0 :(得分:0)

对于我的理解,在任何一种情况下都应该释放head,只有当列表有尾部时才应该进行递归调用。此外,还可以涵盖列表为空的情况,这将导致以下实现。

void destroyListRecursive(node *head)
{
    if (head != NULL)
    {
        destroyListRecursive(head->next);
        free(head);
    }
}

答案 1 :(得分:0)

您的代码使用

取消引用链接列表最后一个元素上的NULL指针
if ( head->next == NULL)
    return;

当最后一个元素递归传递给函数时,它的值将在head参数中,所以

if ( (NULL)->next == NULL)
    return;

那是Undefined Behavior

您的递归函数只能检查head值:

void destroyListRecursive(node *head)
{
    if ( head == NULL)
        return;

    destroyListRecursive(head->next);

    free(head);
}