Добрый вечер. В задании необходимо было создать лес бинарных деревьев по введённым данным, единичное дерево было реализовано через класс:
class btree
{
public:
btree();
~btree();
void print();
void insert(int key, std::string data);
void destroy_tree();
private:
void print(node *leaf);
void destroy_tree(node *leaf);
void insert(int key, std::string data, node *leaf);
node *root;
};
Где node представляет:
struct node
{
int key_value; //глубина узла
std::string data; //значение узла
node* left; //левая ветка
node* right; //правая ветка
};
Дерево образуется так: ( - уровень ниже, ) - уровень выше, ',' - узел того же уровня, пример строки в коде:
int main(void)
{
std::string str;
std::string buff;
btree tree;
std::vector<btree> woods;
unint i=0;
unint n=0;
str="a(d(e)c(n))";
while(str[i])
{
if(str[i]!='(' && str[i]!=')' && str[i]!=',')
buff+=str[i];
if(str[i]==',') //Встречаем ,
{
if(n==0) //Если уровень 0, то кладём дерево в массив и чистим нынешнее
{
woods.push_back(tree);
tree.destroy_tree();
}
else //Отлично от нуля - разные узлы
{
tree.insert(n, buff);
buff.clear();
}
}
switch (str[i])
{
case '(': //Встречаем ( - увеличиваем уровень на 1
tree.insert(n, buff); // кладём буферную строку
buff.clear(); //очищаем её
n++;
break;
case ')': //Встречаем ) - уменьшаем уровень на 1
tree.insert(n, buff); // кладём буферную строку
buff.clear(); //очищаем её
n--;
break;
}
i++;
}
tree.print();
}
Единичное дерево код прекрасно обрабатывает и все функции работают корректно: insert - добавить, print - вывести дерево, destroy_tree - уничтожить дерево. Если попытаться добавить дополнительное дерево (такого же типа строка, через запятую при уровне равном 0) ты выскакивает следующая ошибка:
0 [main] BinWTreeEcl 5876 cygwin_exception::open_stackdumpfile: Dumping stack trace to BinWTreeEcl.exe.stackdump
BinWTree - название исходника. Помогите понять в чём заключается ошибка, пробовал аналогично через отдельный список - та же ситуация. Какие варианты ещё есть?
Не реализован конструктор копирования/перемещения (и операторы присваивания тоже). Отсюда получаем:
woods.push_back(tree);//Добавили в вектор (скопировался root)
tree.destroy_tree();//Следом уничтожили и в векторе теперь висячий указатель.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
У меня есть код на C++ с использованием qt:
я распаковал openCV прописал переменную и path сделал настройки в проекте, ничего красным не светится - при компиляции ошибка
Вот вопрос возник на днях,а хакеры допустим пишущие програмы(взломы) на c++ знают этот язык полностю или отдельные разделы языка?(Очень важный...
Разрабатываю приложение, выводящее различную информацию о процессах в системеОдна из задач - вывести список используемых процессом dll библиотек...