递归printLinkedList函数需要打印"(空字符串)。"在C

时间:2015-10-30 03:25:29

标签: c recursion linked-list

void printLinkedList(node *head)
{

    if (head == NULL)
    {
        printf("(empty string)");
        return;
    }

    printf("Data: %d\n", head->data);
    printLinkedList(head->next);
}

问题是,如果head不等于NULL,它将奇妙地打印链表,但最后,它输入if(head == NULL),因为它是一个递归函数并打印& #34;(空字符串)"任何链表(空或不)。我只想打印"(空字符串)"如果它最初是空的。我该怎么编码?

2 个答案:

答案 0 :(得分:0)

您的递归函数实际上无法知道您是第一次调用它还是在遍历列表时调用它。因此,即使您有一个非空列表,最终也会到达列表的末尾,在这种情况下似乎是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: %d\n", head->data);
        printLinkedList(head->next, counter);
    }
}

然后当你第一次调用这个函数时,将第二个参数传递为0。

答案 1 :(得分:0)

void printLinkedList(node *head)
{

    if (head == NULL)
    {
        printf("(empty list)\n");
        return;
    }
    if (head->next == NULL)
    {
        printf("Data: %d\n", head->data);
        return;
    }

    printf("Data: %d\n", head->data);
    printLinkedList(head->next);
}