В настоящее время я пытаюсь написать программу, которая использует 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 внутри строкового файла (если это поможет). Эта информация на самом деле не очень мне помогла, так что, может быть, кто-то может помочь мне с тем, что именно здесь не так?
Есть несколько проблем. Исправьте следующий материал и посмотрите, работает ли он тогда …
CPP, вставьте:
Ваше условие if является заданием.
cpp, initNode:
Функция изменяет копию переданного указателя.
Звонящий не получит ничего от выделенного объекта.
Использовать ссылку на указатель (&*) или указатель на указатель
(с соответствующим вызовом функции и контентом) в качестве аргумента ..
То есть,
void tree234::initNode(Node *& node)
для одного у вас есть:
if (nullRoot = true) {
то, что вы, вероятно, хотите, это «==», вы должны, вероятно, проверить предупреждения компилятора, а также ошибки.
Надеюсь, это поможет.
🙂
«==» — это сравнение (результат логический), тогда как «=» — это присваивание, следовательно, вы устанавливаете для nullRoot значение true.