我目前正在通过做老师为我们学习的练习问题进行测试,并且我正在努力解决链接列表中的删除元素。我得到了无限循环,我不太清楚为什么!有人可以告诉我正确的方向吗?我已经制作了一个删除元素而没有递归的方法(在下面发布),并尝试遵循这个指南。但是,我似乎无法让我的递归方法工作。以下是我的代码:
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;
我真的很感激在正确的方向上轻推! :)
答案 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;
您的递归函数只能检查head
值:
void destroyListRecursive(node *head)
{
if ( head == NULL)
return;
destroyListRecursive(head->next);
free(head);
}