我正在尝试创建一个结构树,并将我的树节点数据插入到包含两个数据持有者的结构中。我的树/数据结构看起来像这样:
class BinarySearchTree
{
private:
struct IndexEntry
{
int acctID; // (key) Account identifier
long recNum; // Record number
};
struct tree_node
{
IndexEntry* entry;
tree_node* left;
tree_node* right;
};
tree_node* root;
public:
BinarySearchTree()
{
root = NULL;
}
bool isEmpty() const { return root == NULL; }
void insert(int, int);
int search(int);
int treeSearch(tree_node*, int);
};
我在插入功能中此时遇到内存访问冲突,说实话,这是我第一次尝试使用结构树,所以我不知道它是否是一个结构树正确的插入功能开始。但这是:
void BinarySearchTree::insert(int rNum, int aNum)
{
tree_node* t = new tree_node;
tree_node* parent;
t -> entry -> recNum = rNum; //right here I get a violation
t -> entry -> acctID = aNum; //but if I remove the assignments
t -> left = NULL; //it gives me a violation further down
t -> right = NULL;
parent = NULL;
if (isEmpty())
root = t;
else
{
tree_node* current;
current = root;
// Find the Node's parent
while (current)
{
parent = current; //This whole block will give me a memory violation
if (t -> entry -> recNum > current -> entry -> recNum)
current = current -> right;
else current = current -> left;
}
if (t -> entry -> recNum < parent -> entry -> recNum)
parent -> left = t;
else
parent -> right = t;
}
}
请参阅我在第二个代码块中的注释,了解内存访问违规的位置。我认为代码中有一些未初始化的东西,但我不知道它会在哪里或如何初始化它。
任何帮助或指示都将不胜感激!
答案 0 :(得分:0)
您需要初始化t->entry
tree_node *t = new tree_node;
t->entry = new IndexEntry;
答案 1 :(得分:0)
您正在取消引用未初始化的指针。当你这样做时:
tree_node* t = new tree_node;
然后编译器将执行默认构造函数,它实际上什么都不做。 t->entry
未分配任何值且包含垃圾。
所以稍后你用以下方法取消引用它时:
t -> entry -> recNum = rNum; //right here I get a violation
(t -> entry ->
是取消引用操作),您将获得未定义的行为,在您的情况下会导致崩溃。
解决方案是在解除引用之前初始化t -> entry
。
答案 2 :(得分:0)
entry
中的tree_node
指针未正确初始化,它是一个指针,并且它没有指向有效对象。您可以在构造函数中初始化它,并且不要忘记在析构函数中删除它。
struct tree_node
{
IndexEntry *entry;
tree_node *left;
tree_node *right;
tree_node() :
entry(new IndexEntry), // create a new entry object
left(NULL), right(NULL)
{}
~tree_node()
{
delete entry; // release the memory when we're done
}
};
事实上,我不明白为什么你需要首先在堆中创建IndexEntry
。似乎entry
是tree_node
的一部分,因此您只需将其“嵌入”tree_node
:
struct tree_node
{
IndexEntry entry; // not a pointer, but an object
tree_node *left;
tree_node *right;
};
当然,您在访问.
的成员时需要使用entry
:
tree_node *t = new tree_node;
t->entry.recNum = rNum;
t->entry.acctID = aNum;
t->left = NULL;
t->right = NULL;