Разыменование двойного указателя для передачи в рекурсивную функцию - PullRequest
1 голос
/ 13 мая 2019

У меня есть следующая рекурсивная функция, которая должна вызывать себя, передавая указатель по ссылке.Как я могу разыменовать tmproot->left и tmproot->right, чтобы я мог передать его на tree_input()?

typedef struct node_s {

    int value;
    struct node_s *left;
    struct node_s *right;

} node_t;

node_t new_node() {
    node_t *new_node = (node_t*)malloc(sizeof(node_t));
    new_node->left = NULL;
    new_node->right = NULL;
    return *new_node;
}

void tree_input(int value, node_t **tmproot)
{
    if (*tmproot == nullptr) {
        node_t *node = &new_node();
        node->value = value;
    }
    else if (value < (*tmproot)->value) {
        tree_input(value, tmproot->left);
    }
    else if (value >= value) {
        tree_input(value, tmproot->right);
    }
    return;
}

tree_input() вызывается в первый раз, используя tree_input(new_value, &root); Я уверен, что пропускаюпростой трюк.

1 Ответ

2 голосов
/ 13 мая 2019

Чтобы ответить на вопрос в виде вопроса:

void tree_input() принимает указатель на указатель в качестве аргумента, а node_s->left - указатель.Поэтому все, что вам нужно сделать, это получить указатель на указатель с помощью операнда address-of.

Однако, поскольку tmproot является указателем на указатель, его также необходимо разыменовать перед тем, как выможно использовать оператор ->.

tree_input(value, &(*tmproot)->left);

Однако вы также должны знать, что ваша функция new_node() и способ ее использования довольно неработоспособны.

При настройке теперь вы создаете новый node_t в куче, копируете его в стек и сохраняете указатель на этот экземпляр стека в своем дереве, который сразу становится висящим указателем, аВыделенная куча память просто утекает.

Чтобы исправить это, функция должна возвращать node_t*, а не node_t.Все остальное должно течь естественно оттуда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...