Рекурсивная структура (двоичное дерево): получить значения через указатель структуры изнутри функции - PullRequest
0 голосов
/ 16 марта 2019

Я выполняю базовое двоичное дерево. Узлы дерева - это структуры, содержащие три поля, целочисленное значение и указатели на левого и правого потомков:

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 Ответ

2 голосов
/ 16 марта 2019

Ваша функция инициализации использует локальную переменную, которая больше не доступна после возврата из функции.Измените его на:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...