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), потому что это рекурсивная функция, и печатает «(пустая строка)» для любой связанный список (пустой или нет). Я хочу напечатать «(пустая строка)», только если она изначально пуста. Как бы я закодировал это?
Вы уверены, что хотите использовать рекурсию для этого? (Это обучающее упражнение?) — person DJSweetness schedule 30.10.2015
Ну, это было намного проще как итеративная функция, но нас попросили написать ее рекурсивно, чтобы лучше понять и попрактиковаться в рекурсии, чтобы ответить на ваш вопрос, да, это учебное упражнение. — person DJSweetness schedule 30.10.2015
Ваша рекурсивная функция, как она есть, не имеет возможности узнать, вызываете ли вы ее в первый раз или она вызывается во время обхода списка. Итак, даже если у вас есть непустой список, в конце концов вы достигнете конца списка, который в данном случае кажется NULL. Если вам нужно проверить, пуст ли список, я бы порекомендовал написать вспомогательную функцию, которая сделает это за вас, а затем запустит рекурсию, например:
А затем выньте printf(«(пустая строка)») из рекурсивной функции.
Или, если вы действительно хотите сохранить его как одну рекурсивную функцию, вы можете добавить аргумент счетчика, который увеличивается с каждым рекурсивным вызовом, например:
И затем, когда вы вызываете эту функцию в первый раз, передайте второй аргумент как 0.
Спасибо за ваш ответ @jas. Вспомогательная функция великолепна. — person DJSweetness; 30.10.2015