Поток программ со связанным списком с учетом выполнения стека программ

static void just_traverse(sll **head_ref) {
    sll *first = *head_ref;
    sll *second = (*head_ref)->next;

    if(second == NULL) {
            return;
    }

    just_traverse(&(second));
    *head_ref = second;
    printf("%d \t",second->payload);
}

В приведенном выше коде, если я удаляю *head_ref = second; Однако я получаю вывод относительно стека. Если я поставлю эту строку *head_ref = second; Он всегда печатает последний элемент скажет {4,3,2,1}, затем он всегда печатает 1? Кто-нибудь может объяснить, почему?

3 ответа

Решение

Если ваш список содержит {4,3,2,1}, то ваш вывод должен быть 1 1 1 право.

Это из-за заявления *head_ref = second;, В 3-м вызове функции just_traversehead_ref будет указывать на 2 а также second будет указывать на 1, Сейчас вы обновляете **head_ref в 1, Теперь вы печатаете second, Таким образом, выходной будет значение 1

И тогда он вернется ко 2-му вызову, здесь head_ref является 3 а также second является 1 (не 2 потому что мы обновили в 3-й все). Теперь очередное назначение 1 в голову и печать second, Опять он напечатает значение 1 только.

И тогда он вернется к 1-му вызову, здесь head_ref является 4 а также second является 1 (не 3 потому что мы обновили во 2-м вызове). Теперь очередное назначение 1 в голову и печать second, Опять он напечатает значение 1 только.

Таким образом, на выходе будет три 1

1 1 1
  1. Вы можете попытаться отладить, чтобы выяснить, почему вы указали неправильно указатель.

  2. Вероятно, это должно быть следующим

    just_traverse(&(второй)); second->next = first; first->next = NULL;

Я думаю, что вы пытаетесь сделать его слишком сложным - это не проверено, но, по крайней мере, является более простым шаблоном для выполнения рекурсивного обратного обхода по односвязному списку:

static void just_traverse(sll *head_ref) {
    if (head_ref == NULL) {
            return;
    }

    just_traverse(head_ref -> next);

    printf("%d \t",head_ref->payload);
}
Другие вопросы по тегам