I'm trying to replicate a Binary Tree where the Nodes have a struct in its Node
class. I can't seem to figure why it crashes when setting the bookName
string. It keeps on crashing. Going to debug mode, it says it can't see the reference number or can't read the string.
#include <iostream>
#include <string>
using namespace std;
struct Book {
string name;
};
struct TreeNode {
float key;
Book book;
TreeNode* leftPtr;
TreeNode* rightPtr;
};
class MyTree {
TreeNode* rootPtr;
// this function crashes!
TreeNode* makeNode(float key,string bookName) {
TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
if (newNode == NULL) {
cout << "Error: No more space";
}
else {
newNode->key = key;
cout << newNode->book.name << endl;
newNode->book.name = bookName;// CRASHES HERE
cout << "Name: " << newNode->book.name;
newNode->leftPtr = NULL;
newNode->rightPtr = NULL;
}
return newNode;
}
TreeNode* insert(TreeNode* nodePtr, float key, string bookName) {
if (nodePtr == NULL) {
nodePtr = makeNode(key, bookName);
}
else if (key < nodePtr->key) {
nodePtr->leftPtr = insert(nodePtr->leftPtr, key, bookName);
}
else if (key > nodePtr->key) {
nodePtr->rightPtr = insert(nodePtr->rightPtr, key, bookName);
}
else { cout << "Error: Key already exist. Cannot add node."; }
return nodePtr;
}
public:
MyTree() { rootPtr = NULL; }
void addNode() {
// ask for input
float key = 0; string bookName = "default";
cout << "Enter a value for the key: ";
cin >> key;
cout << "Enter the name for the book: ";
cin >> bookName;
// insert
rootPtr = insert(rootPtr, key, bookName);
}
};
int main() {
MyTree a;
a.addNode();
}
The debug error message is this:
Exception thrown at 0x0121DA2E in Assessment.exe: 0xC0000005: Access violation reading location 0xCDCDCDCD.
Please help
Edit 1:
Replaced the malloc as suggested but it crashes when setting the key
variable.
TreeNode* makeNode(float key,string bookName) {
cout << "Here";
TreeNode* newNode = new TreeNode;// CRASHES HERE
cout << "Here";
if (newNode == NULL) {
cout << "Error: No more space";
}
else {
newNode->key = key;
newNode->book.name = bookName;
cout << "Name: " << newNode->book.name;
newNode->leftPtr = NULL;
newNode->rightPtr = NULL;
}
return newNode;
}