Novi sam u C++, imam zadatak da napravim stablo za unos i brzu pretragu podataka. Ali, imam problema sa dealokacijom, kompajler mi daje gresku u funkciji destroy_tree: glibc detected. Takodjer, kako cu obrisati zone_id? Moze li mi neko pomoci? Ovo je moj kod:
Tree.h
Code (cpp):
#ifndef TREE_H
#define TREE_H
#define NUM_ELEMS 74
#include <string>
struct node {
int* zone_id;
node* leaves [NUM_ELEMS];
node() : leaves() {};
};
class Tree {
public:
Tree();
~Tree();
void insert (std::string, int);
void destroy_tree();
int* search_tree (std::string);
private:
void insert (std::string, node**, int, int);
void destroy_tree (node*);
int* search (std::string, node**, int);
node* root;
};
#define TREE_H
#define NUM_ELEMS 74
#include <string>
struct node {
int* zone_id;
node* leaves [NUM_ELEMS];
node() : leaves() {};
};
class Tree {
public:
Tree();
~Tree();
void insert (std::string, int);
void destroy_tree();
int* search_tree (std::string);
private:
void insert (std::string, node**, int, int);
void destroy_tree (node*);
int* search (std::string, node**, int);
node* root;
};
Tree.cpp
Code (cpp):
#include "Tree.h"
#include <iostream>
using namespace std;
Tree::Tree() {
root = NULL;
}
Tree::~Tree() {
destroy_tree();
}
void Tree::destroy_tree() {
destroy_tree(root);
}
void Tree::destroy_tree(node* parent) {
if ( parent != NULL ) {
for (int i=0; i<NUM_ELEMS; i++) {
destroy_tree( parent->leaves[i] );
}
delete parent;
}
}
void Tree::insert(string str, int zone_id) {
int num=0;
if (root != NULL)
insert (str, &root, num, zone_id);
else {
root = new node;
insert (str, &root, num, zone_id);
}
}
void Tree::insert(string str, node** parent, int num, int zone_id) {
int value;
if (num < str.length()) {
value = (int)str[num] - 48;
if ((*parent)->leaves[value] != NULL)
insert (str, &((*parent)->leaves[value]), num+1, zone_id);
else {
(*parent)->leaves[value] = new node;
if (num == str.length() -1) {
(*parent)->leaves[value]->zone_id = new int;
*((*parent)->leaves[value]->zone_id) = zone_id;
}
else {
insert (str, &((*parent)->leaves[value]), num+1, zone_id);
}
}
}
}
int* Tree::search_tree (string str) {
int num = 0;
return search (str, &root, num);
}
int* Tree::search(string str, node** parent, int num) {
int value;
if (num < str.length()) {
value = (int)str[num] - 48;
if ((*parent)->leaves[value] != NULL && num != str.length() -1) {
return search (str, &((*parent)->leaves[value]), num+1);
} else if (num == str.length() -1 && (*parent)->leaves[value] != NULL) {
if ( (*parent)->leaves[value]->zone_id != NULL )
return (*parent)->leaves[value]->zone_id;
else
return NULL;
} else
return NULL;
} else
return NULL;
}
#include <iostream>
using namespace std;
Tree::Tree() {
root = NULL;
}
Tree::~Tree() {
destroy_tree();
}
void Tree::destroy_tree() {
destroy_tree(root);
}
void Tree::destroy_tree(node* parent) {
if ( parent != NULL ) {
for (int i=0; i<NUM_ELEMS; i++) {
destroy_tree( parent->leaves[i] );
}
delete parent;
}
}
void Tree::insert(string str, int zone_id) {
int num=0;
if (root != NULL)
insert (str, &root, num, zone_id);
else {
root = new node;
insert (str, &root, num, zone_id);
}
}
void Tree::insert(string str, node** parent, int num, int zone_id) {
int value;
if (num < str.length()) {
value = (int)str[num] - 48;
if ((*parent)->leaves[value] != NULL)
insert (str, &((*parent)->leaves[value]), num+1, zone_id);
else {
(*parent)->leaves[value] = new node;
if (num == str.length() -1) {
(*parent)->leaves[value]->zone_id = new int;
*((*parent)->leaves[value]->zone_id) = zone_id;
}
else {
insert (str, &((*parent)->leaves[value]), num+1, zone_id);
}
}
}
}
int* Tree::search_tree (string str) {
int num = 0;
return search (str, &root, num);
}
int* Tree::search(string str, node** parent, int num) {
int value;
if (num < str.length()) {
value = (int)str[num] - 48;
if ((*parent)->leaves[value] != NULL && num != str.length() -1) {
return search (str, &((*parent)->leaves[value]), num+1);
} else if (num == str.length() -1 && (*parent)->leaves[value] != NULL) {
if ( (*parent)->leaves[value]->zone_id != NULL )
return (*parent)->leaves[value]->zone_id;
else
return NULL;
} else
return NULL;
} else
return NULL;
}
Hvala!
[Ovu poruku je menjao Thrash3d dana 14.01.2013. u 13:22 GMT+1]
[Ovu poruku je menjao Thrash3d dana 14.01.2013. u 13:23 GMT+1]