【问题标题】:Linked list program flow with respect program stack execution关于程序堆栈执行的链表程序流程
【发布时间】:2012-08-08 19:01:45
【问题描述】:
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?谁能解释为什么?

【问题讨论】:

  • 你想达到什么目的?如果您只是遍历,为什么要通过 ** 而不是 sll * ? sll的定义是什么?
  • 这段代码是递归反向链表的一部分。谁能告诉我为什么“第二”指针永远不会改变
  • 如果你真的需要反转而不仅仅是以相反的顺序输出值。我在答案中发布了您需要在程序中进行的一些更改。

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


【解决方案1】:

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

这是因为声明 *head_ref = second;。在第三次调用函数just_traversehead_ref 将指向2second 将指向1。现在您将**head_ref 更新为1。现在您正在打印second。所以输出将是值1

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

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

所以输出将是三个1

1 1 1

【讨论】:

  • 感谢您的回答,但我有问题“然后它将返回到第二次调用,这里 head_ref 为 2,第二次为 1(不是 2,因为我们在第三次全部更新)。”但是在第三次调用中,我们更新了 *head_ref 而不是第二个,即 *head_ref = second;那么为什么“秒”的值不会改变
  • @error_404 :在第 3 次通话中,您更新了 **head_ref,在第 2 次通话中只不过是 second。因为我们通过从第二次调用传递second 的地址来调用第三次调用。如果喜欢,也可以为答案投票。
【解决方案2】:
  1. 您可以尝试调试以找出错误设置指针的原因。

  2. 应该是这样的

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

【讨论】:

    【解决方案3】:

    我认为您试图使其过于复杂 - 这未经测试,但至少是一种更简单的模式,用于在单链表上执行递归反向遍历:

    static void just_traverse(sll *head_ref) {
        if (head_ref == NULL) {
                return;
        }
    
        just_traverse(head_ref -> next);
    
        printf("%d \t",head_ref->payload);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-08
      • 1970-01-01
      • 1970-01-01
      • 2019-03-07
      • 2011-01-26
      • 2013-06-24
      相关资源
      最近更新 更多