Поток программ со связанным списком с учетом выполнения стека программ
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_traverse
head_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
Вы можете попытаться отладить, чтобы выяснить, почему вы указали неправильно указатель.
Вероятно, это должно быть следующим
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);
}