Saturday 15 June 2013

c++ - Cross Class Pointers -



c++ - Cross Class Pointers -

for binary tree implementation using standard templated bst implementation. have 2 simple classes:

treenode ( contains data, left pointer, right pointer ) tree ( contains root pointer, insert() function , misc const functions )

using insert(data) in tree class treenode instance of templated info type added tree instance. first node added referenced treenode *root in tree, nodes after can accessed using left , right pointer traversal.

using method created 2 tree instances, , b. want add together 3rd tree instance c, contains single root node. left pointer of root node points towards root node of instance , right pointer of root node points towards root node of instance b. however, when seek compiler gives me segmentation fault. have absolutely no thought how create work way want to.

here image illustrate want:

so want 2 pointers:

(c.root)->left = (a.root); (c.root)->right = (b.root);

but doesn't work. can create singular instance of treenode ( without tree class ) , utilize pointers of treenode point towards both root nodes of , b. seems work fine, removes bst functionality new root need.

does have kind of memory allocation issue in classes? know can re-create each single node of both sub-trees , place them in new tree using insert(), prefer able , efficiently create , compare pairs of big selection of bst instances.

any kind of help appreciated!

here relevant code segments:

main.cpp

#include <iostream> #include "tree.h" #include "tree.cpp" using namespace std; using wyp::searchtree; using wyp::treenode; int main(){ searchtree<int> a; searchtree<int> b; searchtree<int> c; a.insert(2); a.insert(1); a.insert(3); b.insert(8); b.insert(7); b.insert(9); c.insert(5); (c.root)->left = (a.root); // here causes segmentation fault (c.root)->right = (b.root); homecoming 0; }

tree.h

... template<class t> class treenode{ public: treenode() : data(null){} treenode(t data, treenode<t> *left, treenode<t> *right) : data(data), left(left), right(right){} friend class searchtree<t>; t data; treenode<t> *left; treenode<t> *right; }; template<class t> class searchtree{ public: searchtree() : root(null){} virtual ~searchtree(); void insert(t item); ... treenode<t> *root; private: void insert(t item, treenode<t> *& subtreeroot); ... };

tree.cpp

... template<class t> void searchtree<t>::insert(t item, treenode<t> *& subtreeroot){ if(subtreeroot == null){ subtreeroot = new treenode<t>(item, null, null); }else if(item < subtreeroot->data){ insert(item, subtreeroot->left); }else{ insert(item, subtreeroot->right); } } template<class t> void searchtree<t>::insert(t item){ insert(item, root); } ...

c++ pointers tree

No comments:

Post a Comment