🧙Конкурс сказок!
C++/C++11
(OFF) Beta_Master (S) 14 ноя 2018

Дерово

Всем привет:даров
Ребят, помогите написать дерево для хранения слов посимвольно.
Вот что у меня есть. Проблема в том, что после завершения цыкла по добавлению новых нодов, они не сохраняются:гг я вот думаю что нужно использовать ссылку на указатель, но вот как?

#include <iostream>
#include <bits/stdc++.h>
using namespace std;

class Node{
public:
Node *left;
Node *right;
char symb;
};

class Tree{
public:
Node *start;
Tree(){
//*start = new Node;
start->left = nullptr;
start->right = nullptr;
start->symb = '0';
}
void add(string s){
s += '/n';
int Size = s.size(), counter = 0;
if(start->symb == '0'){
Node *tmp = new Node;
tmp->symb = s[counter];
start->left = *tmp;
while(Size-1 > counter){
Node *add = new Node;
add->symb = s[counter];
//cout << endl << add->symb << endl;
tmp->left = *add;
counter++;
//cout << endl << counter << endl;
}
}
}
void out(){
if(start->symb == '0')
cout << endl << "Null Tree" << endl;
else{
cout << start->symb;
Node *next = start->left;
while(next->left != nullptr || next->symb != '\n'){
cout << next->symb;
next = next->left;
}
}
}
};

int main()
{
setlocale(LC_ALL, "Russian");
Tree tree;
tree.add("FirstWord");
tree.out();
//cout << tree.start.symb << endl;
return 0;
}



Комментарии (10)

Есть подозрение, что если убрать один символ *, то всё может заработать, но это не точно.

Но кроме этого я не понимаю, зачем тебе C++, если ты его не используешь вообще.

add зачем-то выполняет функцию, которая должен брать на себя конструктор.

Зачем-то появился out, хотя у тебя есть возможность перегружать операторы.

Почему не for? Это не круто писать код так, чтобы он становился менее понятным.
да, я не удалил лишние *, там в двух местах их не должно быть

ну это только начало, когда я пойму как правильно добавлять корень и новые слова - будет полноценный класс

add сейчас для примера, потом перейдет в конструктор

то же самое, вывод тестовый, написан быстро, для проверки наличия корня

ну да, есть смысл использовать фор
Ааа. Ты в цикле постоянно присваиваешь указатели на новые ноды в left одной и той же ноде и выходит, что "забываешь" все кроме последней. В памяти программы они есть, но к ним нельзя обратиться никаким явным способом.
tmp = tmp->left нужно добавить.
Вот я написал но оно выходит бессмысленно.хранить одинаковые буквы нельзя.так что незнаю как это даже можно использовать. вот если-бы подсчитывать одинаковые буквы в словах или повторы в файлах.
в общем вот код:


#include <cstdio>

using namespace std;

namespace MainTree
{


struct Node
{
Node *left;
Node *right;

char data;

};

class Tree
{
Node *root;
Node *rab;

void show_( Node *r );
void free_tree( Node *r);

public:

Tree(){ root = 0;}
~Tree(){ free_tree( root ); }

void Add(const char *str);
void Show(){ if( !root ) return; show_( root ); }

};

void Tree::Add(const char *str)
{
if (!*str) return;

Node *nw = new Node;
nw->left = nw->right = 0;
nw->data = *str++;


if (!root)
{
root = nw;

if (!*str)
return;
}

Node *p0, *p;
bool itnew;

while (*str)
{
itnew = true;
p = root;

while (p)
{
p0 = p;

if (*str < p->data)
p = p->left;
else if (*str > p->data)
p = p->right;
else
{
itnew = false; break;
}
}

if ( itnew )
{

nw = new Node;
nw->left = nw->right = 0;
nw->data = *str;

if( *str > p0->data )
p0->right = nw;
else
p0->left = nw;
}

++str;
}

}

void Tree::show_( Node *r )
{

if( r )
{
show_( r->left );
printf("%c ", r->data );
show_( r->right );
}
}

void Tree::free_tree( Node *r )
{

if( r )
{
free_tree( r->left );
free_tree( r->right );
delete r;
}
}

}

int main()
{
MainTree::Tree tree;

const char *str = "Alabai";

tree.Add( str );
tree.Show();

return 0;
}
Дальше bool itnew я это не смог вынести. Это бред, извини.

Учись нормально называть переменные и пользуйся тэгом code на сайте, пожалуйста.
ах да забыл еще проверку в деструктор добавить.
вот так:
~Tree(){ if( root )free_tree( root ); }

а нормально называть переменные это типа такие имена на 50 букв.не меня ломает.
итак всем понятно что *p это указатель. или что мне писать PointerInTreeNodeRoot :)
полная фигня
p - это просто буква, ты сам через неделю не сразу поймёшь, что она означала. Написать pointer у тебя сил хватит, не помрёшь, а назначение переменной будет однозначно. Тащить энтерпрайзные простыни из Java тоже не стоит..
Вот так переписал:

#include <cstdio>


using namespace std;

namespace MainTree
{


struct Node
{
Node *left;
Node *right;
char data;
};

class Tree
{
Node *m_Root;

void show_(Node * node);
void free_tree(Node * node);

public:

Tree(){ m_Root = 0; }
~Tree(){ if (m_Root) free_tree(m_Root); }

void Add(const char *str);
void Show(){ if (!m_Root) return; show_(m_Root);}

};

void Tree::Add(const char *str)
{
if (!*str)return;

Node *NewNode = new Node;
NewNode->left = NewNode->right = 0;
NewNode->data = *str++;

if (!m_Root)
{
m_Root = NewNode;

if (!*str) return;
}

Node *Parent, *ThisNode;
bool itnew;

while (*str)
{
itnew = true;
ThisNode = m_Root;

while ( ThisNode )
{
Parent = ThisNode;

if ( *str < ThisNode->data )
ThisNode = ThisNode->left;
else if ( *str > ThisNode->data )
ThisNode = ThisNode->right;
else
{
itnew = false;
break;
}
}

if( itnew )
{
NewNode = new Node;
NewNode->left = NewNode->right = 0;
NewNode->data = *str;

if( *str > Parent->data )
Parent->right = NewNode;
else
Parent->left = NewNode;
}

++str;
}

}

void Tree::show_(Node * node)
{
if( node )
{
show_( node->left );
printf("%c ", node->data);
show_(node->right);
}
}

void Tree::free_tree( Node *node)
{
if (node)
{
free_tree(node->left);
free_tree(node->right);
delete node;
}
}

}

int main()
{
MainTree::Tree tree;

const char *str = "Western Union";

tree.Add(str);
tree.Show();

return 0;
}
О я теперь понял как код вставлять:)
:-д

спасибо за пример=)
Показать комментарий
Скрыть комментарий
Для добавления комментариев необходимо авторизоваться
C++/C++11
Мстители: Охота началась!
Ожесточенные бои, интересный сюжет, захватывающие...
Тема: Светлая | Тёмная
Версия: Mobile | Lite | Touch | Доступно в Google Play