【问题标题】:C - Pointers, functions and recursionC - 指针、函数和递归
【发布时间】:2013-08-27 14:45:58
【问题描述】:

只是试图让一些涉及指针、函数和递归的代码工作:

Node * root = malloc(sizeof(Node));
root->data = "1";
root->next = NULL;
root->child = NULL;

Node * G = NULL;
BuildGraph(root, &G);
printf("Root is: %d\n", root->data);
Print(G, ">>"); // Custom Print function

还有 BuildGraph:

void BuildGraph(Node * head, Node ** G) {
    if (head->child == NULL) { // No child
        printf("Head has no child! %d\n", head->data);
        Push(head, &G);
        Print(G, ">>");
        return;
    }
    BuildGraph(head->child, &G);
    return;
}

所以当我运行程序时,我的输出是这样的:

Head has no child! 1 // printf in BuildGraph
G: 1>> // Print(G, ">>") in BuildGraph
Root is: 1
G is empty! // Print(G, ">>") in main

有人知道 G 没有转入 main 的原因吗?

谢谢。

【问题讨论】:

    标签: c function pointers recursion linked-list


    【解决方案1】:

    void BuildGraph() 内,BuildGraph(head->child, &G); 应该是BuildGraph(head->child, G);。没有&,可能和Push(head, &G);一样

    在您的构建函数中,G 是Node **。在 main() 之外,G 是 Node *

    考虑在BuildGraph() 中使用与 G 不同且更广泛的变量名称。也许像

    void BuildGraph(Node * head, Node ** AddressG) {
        if (head->child == NULL) { // No child
            printf("Head has no child! %d\n", head->data);
            Push(head, AddressG);
            Print(AddressG, ">>");
            return;
        }
        BuildGraph(head->child, AddressG);
        return;
    }
    

    我相信您的编译提供了有关此问题的警告消息。如果他们不建议调查如何打开它们。

    【讨论】:

    • 感谢您的回复。我删除了您所说的所有& 字符,但在调用BuildGraph 后列表仍然为空。我想要实现的是使用从某个节点head 开始的childnext 结构填充G 的递归方式。我已经使用Node ** somelist 实现了Push/Pop,而不必返回很好的新列表,我正在寻找一种方法来做到这一点。还有什么想法吗?
    • 可能需要查看 1) 更多代码,2) 输入数据 3) 编译器警告消息。这可能需要重新提出问题。
    • 感谢您的回复。运行时没有编译器警告消息,输入数据是根节点。至于更多的代码,应该不需要它。原来的帖子已经概述了这个问题。最后一行中G 的输出应该是G: 1>>(在main 中),因为它在BuildGraph 循环中,但它却给了我G is empty!
    • 我看不到“是空的!”来自。您必须收到警告,因为root->data = "1"; 暗示数据是char *printf("Head has no child! %d\n", head->data) 暗示数据是int。或者你的警告没有打开。
    • 不要担心 Print 功能,这是一个简单的自定义功能,可以正常工作。真正的问题是当 BuildGraph 推送到 G 时,G 没有在 main 中更新。
    猜你喜欢
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 2023-04-09
    • 2017-10-13
    • 2010-10-02
    • 1970-01-01
    • 2015-02-19
    • 2014-05-10
    相关资源
    最近更新 更多