Trouble allocating new node

We have an assignment where we need to model two data structures that sort a given data set by name and by type, but cannot allow data duplication. One of the data structures must be a tree, and I have chosen to make both trees. The program reads from a file and provides menu options for the user to add, remove, etc.

I believe I have the program written out, but I'm having big problems with an unhandled exception. I know I am trying to access a node that I haven't allocated memory for, but I can't seem to figure out exactly where or how to do that the first time through.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
  /*Header File for Class Collection
A combination of 2 Binary Search Trees */

#ifndef COLLECTION_H
#define COLLECTION_H
#include "Vendor.h"

typedef struct treeNode{

		Vendor *content;
		treeNode *left, *right;
		treeNode(const Vendor *aVendor){

			*content = *aVendor;
			left = NULL;
			right = NULL;
		}
};

class Collection
{
public:
	Collection();
	Collection(char fileName[]);
	Collection(const Collection& aCollection);
	~Collection();
	const Collection& operator= (const Collection& aCollection);

	void add(const Vendor& aVendor);
	bool remove(char *name);
	bool retrieve(char *name, Vendor& aVendor) const;
	bool retrieve(char *key) const;
	void printByName() const;
	void printByType() const;
	int getNoOfItems() const;
	void saveVendors(char *fileName);

private:

	treeNode *rootByType;
	treeNode *rootByName;
	int noOfItems;
	
	void addToNameTree(treeNode*& root, Vendor *ptrItem);
	void addToTypeTree(treeNode*& root, Vendor *ptrItem);
	bool removeFromNameTree(treeNode*& root, char *key);
	bool removeFromTypeTree(treeNode*& root, char *key);
	void deleteNameNode(treeNode *& target);
	void deleteTypeNode(treeNode *& target);
	bool retrieveType(treeNode *root, char *key) const;
	bool retrieveName(treeNode *root, char *key, Vendor& aVendor) const;
	void print(treeNode *root) const;
	void save(ofstream& output, treeNode *root);
	void destroyTree(treeNode*& root);
	void copyTree(treeNode*& newRoot, treeNode *root);

};

#endif

/*Implementation File for Class Collection*/

#include "Collection.h"
#include "Vendor.h"
#include <iostream>
#include <fstream>
#include <cmath>
#include <cassert>
using namespace std;

Collection::Collection()
{
	rootByName = NULL;
	rootByType = NULL;
	noOfItems = 0;
}

Collection::Collection(char fileName[]){

	noOfItems = 0;
	Vendor currentVendor;
	ifstream input;
	char name[20];
	char phone[14];
	char type [12];
	char events[30];

	input.open(fileName);
	if(!input){

		cerr << "fail to open" << fileName << " for input!" << endl;
		exit(1);
	}

	input.get(name, 20, ';');
	while(!input.eof()){

		input.ignore(100, ';');
		input.get(phone, 14, ';');
		input.ignore(100, ';');
		input.get(type, 12, ';');
		input.ignore(100, ';');
		input.get(events, 30, ';');
		input.ignore(100, '\n');
	
		currentVendor.setName(name);
		currentVendor.setPhone(phone);
		currentVendor.setType(type);
		currentVendor.setEvents(events);

		add(currentVendor);

		input.get(name, 20, ';');
	}
	input.close();
}



const Collection& Collection::operator=(const Collection& aCollection){

	if(this == &aCollection){
		return *this;
	}
	else{

		destroyTree(rootByName);
		copyTree(rootByName, aCollection.rootByName);
		return *this;
	}
}

void Collection::add(const Vendor& aVendor){

	Vendor *pItem = new Vendor;
	*pItem = aVendor;
	
	addToNameTree(rootByName, pItem);
	addToTypeTree(rootByType, pItem);
}

void Collection::addToNameTree(treeNode*& root, Vendor *pItem){

	Vendor *vendor2 = new Vendor;
	Vendor vendor1;
	//*testVendor = root->content;
	vendor1 = *pItem;
	//vendor2 = *root->content;
	//new treeNode;
	treeNode *temp = new treeNode(vendor2);

	if(!root){

		//treeNode *root = new treeNode(pItem);
		*root->content = *pItem;
		noOfItems++;
	}
	else if(*pItem < *root->content){

		addToNameTree(root->right, pItem);
	}
	else{
		addToNameTree(root->left, pItem);
	}
}

void Collection::addToTypeTree(treeNode*& root, Vendor *pItem){

	Vendor vendor1, vendor2;
	vendor1 = *pItem;
	vendor2 = *root->content;

	if(!root == NULL){

		*root->content = *pItem;
		noOfItems++;
	}
	else if(vendor2 > vendor1){

		addToTypeTree(root->right, pItem);
	}
	else{
		addToTypeTree(root->left, pItem);
	}
}


One issue I have is that the if statement on line 152 does not seem to work. I know that there is no root the first time it passes through the code, but it doesn't drop into the code there, just skips by.

Any help would be awesome!

-Mave
I should also say that I lopped out a bunch of the code and didn't include the driver code or any code for the Vendor class. I can post that if need be.

-Mave
Line 14 is a problem. content points to some random place in memory. Dereferencing it results in undefined behavior.
Topic archived. No new replies allowed.