Создание глубокой копии двоичного дерева, содержащего другие структуры в C - PullRequest
0 голосов
/ 09 ноября 2019

У меня есть эта функция, которая должна создавать глубокую копию всего двоичного дерева.

symbol_t* cloneTable(symbol_t *node) {

    if (node == NULL)
        return node;

    symbol_t *newSymbol = malloc(sizeof(symbol_t));
    newSymbol->type = node->type;
    newSymbol->key = node->key;

    if (node->value != NULL) {
        value_t *newValue = malloc(sizeof(value_t));
        newValue = node->value;
        newSymbol->value = newValue;
    }

    newSymbol->leftChild = cloneTable(node->leftChild);
    newSymbol->rightChild = cloneTable(node->rightChild);

    return newSymbol;
}

Когда я изменяю value в исходной таблице, она также изменяется в скопированной таблице,тем не мение.

Что я могу сделать, чтобы создать его глубокую копию?

Заранее благодарю за любую помощь.

1 Ответ

1 голос
/ 09 ноября 2019

In:

    value_t *newValue = malloc(sizeof(value_t));

Вы выделяете память для объекта. Как видно, node содержит указатель на объект значения. С

    newValue = node->value;

вы копируете указатель. Чтобы скопировать значение, используйте:

    *newValue = *node->value;

Теперь вы можете поместить объект в ваш новый узел:

    newSymbol->value = newValue;

Примечание: не забудьте установить newSymbol->value= NULL;, когда node->value==NULL

...