Значение за указателем изменяется при печати - PullRequest
0 голосов
/ 02 мая 2020

Я хочу создать простое двоичное дерево в C ++, используя указатели для каждого узла, указывающего на левого и правого потомков. Я устанавливаю root дерева вручную, затем добавляю одно число к дереву, но, печатая его значение в main (), значение переменной за указателем меняет его значение.

#include <stdlib.h>
#include <iostream>
using namespace std;

struct Node
{
    int data = 0;
    Node *leftNode = NULL;
    Node *rightNode = NULL;
};

void insertNode(Node *node, int newData)
{
    cout << "Testing Node: " << node -> data << " | " << &(node -> data) << endl;
    //smaller (or equal) or bigger
    if (newData > node -> data)
    {
        if (node -> rightNode == NULL)
        {
            Node newNode;
            newNode.data = newData;
            node -> rightNode = &newNode;
        }
        else
        {
            insertNode(node->rightNode, newData);
        }
    }
    else
    {
        if (node -> leftNode == NULL)
        {
            Node newNode;
            newNode.data = newData;
            node -> leftNode = &newNode;
            cout << "Added Node: " << (node -> leftNode) -> data << " AT " << &(node -> leftNode -> data) << endl;
        }
        else
        {
            insertNode(node -> leftNode, newData);
        }
    }
}

int main()
{
    Node firstnode;
    firstnode.data = 42;
    Node *pointer = &firstnode;
    //insert nodes
    /*for (int i = 0; i < 10; i++)
    {
        cout << "Inserting new Element: " << (10 + i) << endl;
        int newI = 10 + i;
        insertNode(&firstnode, newI);
    }*/
    cout << "Inserting new Element: " << (10) << endl;
    int newI = 10;
    insertNode(&firstnode, newI);
    cout << "in main " << firstnode.leftNode -> data << " | " << &(firstnode.leftNode -> data) << endl;
    cout << "in main2 " << firstnode.leftNode -> data << " | " << &(firstnode.leftNode -> data) << endl;

    return 0;
}

Вывод:

Inserting new Element: 10
Testing Node: 42 | 0x61feec
Added Node: 10 AT 0x61fea8
in main 10 | 0x61fea8
in main2 6422216 | 0x61fea8

У вас есть идеи, как это исправить?

1 Ответ

3 голосов
/ 02 мая 2020

Вы присваиваете указатели локальным переменным c. Нестатистические c локальные переменные будут недействительными при возвращении из функции. Вместо этого вы должны динамически распределять узлы.

Другими словами, вы должны использовать

Node* newNode = new Node;
newNode -> data = newData;
node -> rightNode = newNode;

вместо

Node newNode;
newNode.data = newData;
node -> rightNode = &newNode;

, а также делать это для node -> leftNode.

...