void printLinkedList(node *head)
{
if (head == NULL)
{
printf("(empty string)");
return;
}
printf("Data: %dn", head->data);
printLinkedList(head->next);
}
问题是,如果 head 不等于 NULL,它会很好地打印链表,但在最后,它会输入 if(head == NULL(,因为它是一个递归函数并为任何链表打印"(空字符串("(空或不空(。如果最初为空,我只想打印"(空字符串("。我将如何编码?
您的递归函数无法知道您是第一次调用它,还是在您浏览列表期间被调用。因此,即使您有一个非空列表,最终也会到达列表的末尾,在这种情况下,该列表似乎是 NULL。如果您需要检查列表是否为空,我建议您编写一个辅助函数,为您执行此操作,然后为您启动递归,如下所示:
printHelper(node *head)
{
if (head == NULL)
{
printf("(empty string)");
}
else
{
printLinkedList(head)
}
}
然后从递归函数中取出 printf("(空字符串("(。
或者,如果你真的想把它保留为一个递归函数,你可以添加一个计数器参数,该参数随着每次递归调用而递增,如下所示:
void printLinkedList(node *head, int counter)
{
if (head == NULL)
{
if(counter == 0))
{
printf("(empty string)");
return;
}
}
else
{
++counter;
printf("Data: %dn", head->data);
printLinkedList(head->next, counter);
}
}
然后,当您第一次调用此函数时,将第二个参数传递为 0。
void printLinkedList(node *head)
{
if (head == NULL)
{
printf("(empty list)n");
return;
}
if (head->next == NULL)
{
printf("Data: %dn", head->data);
return;
}
printf("Data: %dn", head->data);
printLinkedList(head->next);
}