Вставка в 2-3-4 дерева
В настоящее время я пытаюсь написать программу, которая использует 2-3-4 дерева, и у меня возникают проблемы с функцией вставки. Вот соответствующий код..
int main () {
tree234 myTree;
myTree.insert("hello");
myTree.printTree();
return 0;
}
//-------------tree234.cpp-------------
#include "tree234.h"
#include <string>
#include <iostream>
void tree234::insert(string input){
int index;
if (nullRoot == true) {
//insert root
initNode(root);
root->data[0] = input;
nullRoot = false;
return;
}
}
void tree234::initNode(Node* node) {
node = new Node();
node->pointer[0] = NULL;
node->pointer[1] = NULL;
node->pointer[2] = NULL;
node->pointer[3] = NULL;
node->data[0] = "";
node->data[1] = "";
node->data[2] = "";
}
//-----------tree234.h--------------
#ifndef TREE_234_H_
#define TREE_234_H_
using namespace std;
#include <iostream>
class tree234{
private:
struct Node {
public:
string data[3];
Node* pointer[4];
};
Node* curr;
Node* root;
Node* right;
Node* newRoot;
bool nullRoot = true;
public:
void insert(string data);
void initNode(Node* node);
};
#endif
Он всегда разрывается в строке 19 с ошибкой адреса памяти. Я попытался отладить его, и он разрывается на строке 2245 внутри строкового файла (если это поможет). Эта информация на самом деле не очень мне помогла, так что, может быть, кто-то может помочь мне точно, что здесь не так?
2 ответа
Есть несколько проблем. Исправьте следующий материал и посмотрите, работает ли он тогда...
CPP, вставьте:
Ваше условие if является заданием.
cpp, initNode:
Функция изменяет копию переданного указателя.
Звонящий не получит ничего от выделенного объекта.
Используйте ссылку на указатель (&*) или указатель на указатель
(с соответствующим вызовом функции и контентом) в качестве аргумента. Т.е.,
void tree234::initNode(Node *& node)
Для одного у вас есть:
if (nullRoot = true) {
то, что вы, вероятно, хотите, это "==", вы должны проверить предупреждения компилятора, а также ошибки. Надеюсь, это поможет.:)
"==" - это сравнение (результат логический), тогда как "=" - это присваивание, следовательно, вы устанавливаете для nullRoot значение true.