Рекурсивная функция printLinkedList, требующая печати (пустая строка). в до

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

См. также:  Гарантируется ли, что левый операнд в операторе запятой не будет фактически выполнен, если он не имеет побочных эффектов?
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 2
  1. DJSweetness

    Ваша рекурсивная функция, как она есть, не имеет возможности узнать, вызываете ли вы ее в первый раз или она вызывается во время обхода списка. Итак, даже если у вас есть непустой список, в конце концов вы достигнете конца списка, который в данном случае кажется 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.

    Спасибо за ваш ответ @jas. Вспомогательная функция великолепна. person DJSweetness; 30.10.2015

  2. DJSweetness
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: