递归打印链接列表函数需要用 C 语言打印"(empty string)."


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);
}

相关内容

  • 没有找到相关文章

最新更新