0
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?谁能解释为什么?

4

3 回答 3

0

我认为你试图让它变得太复杂 - 这没有经过测试,但至少是一个更简单的模式,用于在单链表上进行递归反向行走:

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

    just_traverse(head_ref -> next);

    printf("%d \t",head_ref->payload);
}
于 2012-08-08T20:10:39.653 回答
0

如果您的列表包含 {4,3,2,1},那么您的输出应该是1 1 1正确的。

这是因为声明*head_ref = second;。在对函数的第三次调用中,just_traverse head_ref将指向2并且second将指向1. 现在您正在更新**head_ref1. 现在您正在打印second. 所以输出将是价值1

然后它会返回到第二次调用,这里head_ref3second现在1(不是2因为我们在第三次全部更新)。现在再次分配1给 head 和打印second。同样,它将1仅打印该值。

然后它会返回到第一次调用,这里head_ref4second1(不是3因为我们在第二次调用中更新了)。现在再次分配1给 head 和打印second。同样,它将1仅打印该值。

所以输出将是三个1

1 1 1
于 2012-08-09T03:02:47.387 回答
0
  1. 您可以尝试调试以找出错误设置指针的原因。

  2. 大概应该是下面这个

    just_traverse(&(second)); 第二->下一个=第一个;第一个->下一个 = NULL;

于 2012-08-08T20:04:05.550 回答