C++/C++11 C++/C++11
Всем привет
Ребят, помогите написать дерево для хранения слов посимвольно.
Вот что у меня есть. Проблема в том, что после завершения цыкла по добавлению новых нодов, они не сохраняются я вот думаю что нужно использовать ссылку на указатель, но вот как?
Ребят, помогите написать дерево для хранения слов посимвольно.
Вот что у меня есть. Проблема в том, что после завершения цыкла по добавлению новых нодов, они не сохраняются я вот думаю что нужно использовать ссылку на указатель, но вот как?
#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;
}
0 1 0
Комментарии (10)
Есть подозрение, что если убрать один символ *, то всё может заработать, но это не точно.
Но кроме этого я не понимаю, зачем тебе C++, если ты его не используешь вообще.
add зачем-то выполняет функцию, которая должен брать на себя конструктор.
Зачем-то появился out, хотя у тебя есть возможность перегружать операторы.
Почему не for? Это не круто писать код так, чтобы он становился менее понятным.
Но кроме этого я не понимаю, зачем тебе C++, если ты его не используешь вообще.
add зачем-то выполняет функцию, которая должен брать на себя конструктор.
Зачем-то появился out, хотя у тебя есть возможность перегружать операторы.
Почему не for? Это не круто писать код так, чтобы он становился менее понятным.
ответил Framework
да, я не удалил лишние *, там в двух местах их не должно быть
ну это только начало, когда я пойму как правильно добавлять корень и новые слова - будет полноценный класс
add сейчас для примера, потом перейдет в конструктор
то же самое, вывод тестовый, написан быстро, для проверки наличия корня
ну да, есть смысл использовать фор
ну это только начало, когда я пойму как правильно добавлять корень и новые слова - будет полноценный класс
add сейчас для примера, потом перейдет в конструктор
то же самое, вывод тестовый, написан быстро, для проверки наличия корня
ну да, есть смысл использовать фор
Вот я написал но оно выходит бессмысленно.хранить одинаковые буквы нельзя.так что незнаю как это даже можно использовать. вот если-бы подсчитывать одинаковые буквы в словах или повторы в файлах.
в общем вот код:
#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;
}
в общем вот код:
#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;
}
ответил ut2k4
Дальше bool itnew я это не смог вынести. Это бред, извини.
Учись нормально называть переменные и пользуйся тэгом code на сайте, пожалуйста.
Учись нормально называть переменные и пользуйся тэгом code на сайте, пожалуйста.
ответил ut2k4
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;
}
Для добавления комментариев необходимо авторизоваться
Мстители: Охота началась!
Ожесточенные бои, интересный сюжет, захватывающие...