@Davidaa_WoW

Почему создаётся бесконечный указатель в дереве?

Пытаюсь сделать чтение из бинарного файла в дерево поиска. Но в один момент, там где должен быть нулевой указатель почему-то появляется бесконечный указатель на самого себя. Долго искал дебаггером причину, так и не нашёл. Может быть взгляд со стороны поможет?
struct Tree
{
    Tree* left = 0;
    Tree* right = 0;
    int key;
    int size = 1;
    string brand;
    string name;
};

Tree* insert(Tree* tree, int key, string brand, string name)
{
    if (!tree) {
        Tree* newtree = new Tree();
        newtree->key = key;
        newtree->brand = brand;
        newtree->name = name;
        return newtree;
    }
    if (tree->key > key)
        tree->left = insert(tree->left, key, brand, name);
    else
        tree->right = insert(tree->right, key, brand, name);
    return tree;
}

Tree * readElement(Tree* tree) {
    string brand;
    string name;
    int carNumber;
    int len;
    char* buf;
    int left, right;
    iffile.read((char*)&carNumber, 4);
    iffile.read((char*)&len, 4);
    buf = new char[len];
    iffile.read(buf, len);
    brand = buf;
    delete[]buf;
    iffile.read((char*)&len, 4);
    buf = new char[len];
    iffile.read(buf, len);
    name = buf;
    delete[]buf;
    tree = insert(tree, carNumber, brand, name);
    iffile.read((char*)&left, 4);
    if (left) {
        tree->left = readElement(tree);
    }
    else {
        tree->left = 0;
    }
    iffile.read((char*)&right, 4);
    if (right) {
        tree->right = readElement(tree);
    }
    else {
        tree->right = 0;
    }
    return tree;
}

Tree* readFromFile(Tree* tree) {
    iffile.open(filePath, ios::binary | ios::in);
    tree = readElement(tree);
    iffile.close();
    return tree;
}


С самой структурой бинарного файла проблемы нет, по одиночке элементы прекрасно читаются, ломается всё только тогда, когда начинают выставляться связи.
  • Вопрос задан
  • 64 просмотра
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Вот этот код создает кольцевую ссылку:
if (left) {
        tree->left = readElement(tree);
    }


Что вы там пытаетесь сделать? Если вы хотите прочитать элемент в дерево, то ваща readElement(tree) вернет указатель на новый корень. Если выхотите добавить в левое поддерево (и грантируете, что следующий элемент будет меньше корня), то надо добавлять в tree->left а не tree.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы