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?任何人都可以解释为什么?
答案 0 :(得分:0)
您可以尝试调试以找出错误设置指针的原因。
可能应该是以下
just_traverse(及(秒)); second-> next = first; first-> next = NULL;
答案 1 :(得分:0)
我认为你试图让它太复杂 - 这没有经过测试,但至少是一个在单链表上进行递归反向漫步的简单模式:
static void just_traverse(sll *head_ref) {
if (head_ref == NULL) {
return;
}
just_traverse(head_ref -> next);
printf("%d \t",head_ref->payload);
}
答案 2 :(得分:0)
如果您的列表包含{4,3,2,1},那么您的输出应该是1 1 1
。
这是因为声明*head_ref = second;
。在第3次调用函数just_traverse
head_ref
将指向2
,second
将指向1
。现在您要将**head_ref
更新为1
。现在您正在打印second
。因此输出值为1
然后它会返回第二个电话,head_ref
3
second
1
2
(1
不是second
因为我们更新了第3个电话)。现在开始将1
分配给头部和打印head_ref
。同样,它将仅打印值4
。
然后它将返回第一个电话,此处second
为1
而3
为1
(不是second
,因为我们在第二个电话中更新了)。现在开始将1
分配给头部和打印1
。同样,它将仅打印值1 1 1
。
因此输出将为三{{1}}
{{1}}