关于程序堆栈执行的链接列表程序流程

时间:2012-08-08 19:01:45

标签: c algorithm pointers linked-list stack-trace

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 个答案:

答案 0 :(得分:0)

  1. 您可以尝试调试以找出错误设置指针的原因。

  2. 可能应该是以下

    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将指向2second将指向1。现在您要将**head_ref更新为1。现在您正在打印second。因此输出值为1

然后它会返回第二个电话,head_ref 3 second 1 21不是second因为我们更新了第3个电话)。现在开始将1分配给头部和打印head_ref。同样,它将仅打印值4

然后它将返回第一个电话,此处second131(不是second,因为我们在第二个电话中更新了)。现在开始将1分配给头部和打印1。同样,它将仅打印值1 1 1

因此输出将为三{{1}}

{{1}}