递归结构(二叉树):从内部函数通过结构指针获取值

时间:2019-03-16 12:03:33

标签: c function pointers struct

我的任务是实现基本的二叉树。树的节点是包含三个字段,一个整数值以及指向左右子节点的指针的结构:

typedef struct node {
    int    value;
    struct node *child_left;
    struct node *child_right;
} node;

新的节点结构初始化为:

node node_init(int value, node *child_left, node *child_right) {
    node   k = {value, child_left, child_right};
    return k;
}

在父节点的左子节点内部存储值的函数:

int insert_left(node *t, int value) {

    node k = node_init(value, NULL, NULL);

    if (t->child_left == NULL) {
        t->child_left = &k;
    }
    else {
        k.child_left  =  t->child_left;
        t->child_left = &k;
    }
}

一个打印出左孩子的值的函数(这是问题所在):

int node_print(node k) {
    printf("%d", k.child_left->value);
}

测试基本二叉树的主要功能:

int main(int argc, char* argv[]) {

    node root  = node_init(7, NULL, NULL);

    insert_left(&root, 3);
    printf("%d\n", root.child_left->value);
    node_print(root);
}

运行此示例,直接调用printf()会正确打印3作为左孩子的值,但是node_print()输出指针地址的值,例如-406140704。

这可能是一个普遍存在的问题,但是如何从value函数内部正确访问node_print()字段呢?如果可能的话,请引导我阅读一些解释性读物。

1 个答案:

答案 0 :(得分:2)

您的init函数使用局部变量,该局部变量一旦函数返回就不再可用。更改为:

node *node_init(int value, node *child_left, node *child_right) {
    node   *k = malloc(sizeof(*k));
    k->value= value;
    k->child_left= child_left;
    k->child_right= child_right;
    return k;
}