Błąd z dopasowaniem funkcji i wypisywanie drzewa na ekran.
Ostatnio zmodyfikowano 2016-04-24 21:57
ast44 Temat założony przez niniejszego użytkownika |
Błąd z dopasowaniem funkcji i wypisywanie drzewa na ekran. » 2016-04-24 15:16:02 Witam, mam dwa pytania.Pierwsze tyczy się funkcji preorder która jest zaimplementowana w poniższych drzewach.W pierwszym przypadku wszystko działa ok: #include <cstdlib> #include <iostream> using namespace std;
class Element { public: Element * next_left, * next_right, * prev; int number; Element() { next_left = NULL; next_right = NULL; prev = NULL; number = 0; } };
class Head { public: Element * first; int i = 0; void add( int _number ) { if( first == NULL ) { first = new Element; first->number = _number; } else { Element * tmp = first; Element * prev_; while( tmp != NULL ) { prev_ = tmp; if( _number <= tmp->number ) { tmp = tmp->next_left; i = 0; } else { tmp = tmp->next_right; i = 1; } } Element * ptr = new Element; ptr->number = _number; ptr->prev = prev_; if( i == 0 ) { prev_->next_left = ptr; } else { prev_->next_right = ptr; } } } void show( int _number ) { Element * tmp = first; cout << tmp->number << endl; while( tmp != NULL && tmp->number != _number ) { if( _number <= tmp->number ) { tmp = tmp->next_left; } else { tmp = tmp->next_right; } if( tmp != NULL ) { cout << tmp->number << endl; } } } void preorder( Element * e ) { if( e != NULL ) { cout << e->number << " "; preorder( e->next_left ); preorder( e->next_right ); } } Head() { first = NULL; } };
int main() { Head h; h.add( 10 ); h.add( 12 ); h.add( 5 ); h.add( 6 ); h.add( 15 ); h.add( 1 ); h.add( 3 ); h.show( 3 ); h.preorder( h.first ); return 0; }
Ale jak zrobię tak jak poniżej to mi wywala błąd #include <cstdlib> #include <iostream> using namespace std;
class Element { public: Element * next_left, * next_right, * prev; int number; Element() { next_left = NULL; next_right = NULL; prev = NULL; number = 0; } };
class Head { public: Element * first; int i = 0; void add( int _number ) { if( first == NULL ) { first = new Element; first->number = _number; } else { Element * tmp = first; Element * prev_; while( tmp != NULL ) { prev_ = tmp; if( _number <= tmp->number ) { tmp = tmp->next_left; i = 0; } else { tmp = tmp->next_right; i = 1; } } Element * ptr = new Element; ptr->number = _number; ptr->prev = prev_; if( i == 0 ) { prev_->next_left = ptr; } else { prev_->next_right = ptr; } } } void show( int _number ) { Element * tmp = first; cout << tmp->number << endl; while( tmp != NULL && tmp->number != _number ) { if( _number <= tmp->number ) { tmp = tmp->next_left; } else { tmp = tmp->next_right; } if( tmp != NULL ) { cout << tmp->number << endl; } } } void preorder() { if( first != NULL ) { cout << first->number << " "; preorder( first->next_left ); preorder( first->next_right ); } } Head() { first = NULL; } };
int main() { Head h; h.add( 10 ); h.add( 12 ); h.add( 5 ); h.add( 6 ); h.add( 15 ); h.add( 1 ); h.add( 3 ); h.show( 3 ); h.preorder(); return 0; }
Zmieniła się tylko funkcja preorder. Wydaje mi się że korzeń powinien być widoczny w tym zakresie, więc nie wiem skąd taki błąd że nie znajduje funkcji. I drugie pytanie, czy zna ktoś jakiś prosty sposób na wypisanie drzewa na ekran konsoli w formacie graficznym ? W sensie bez tam żadnych udziwnień, tylko żeby struktura drzewa była zachowana. Pozdrawiam |
|
Monika90 |
» 2016-04-24 15:37:17 Zamiast zastępować tę pierwszą wersję funkcji preorder, po prostu dopisz przeciążoną funkcję które wywoła tamtą void preorder() { preorder( first ); }
|
|
ast44 Temat założony przez niniejszego użytkownika |
» 2016-04-24 18:04:17 Nie no spoko, tylko zastanawiam się co jest nie tak z tą pierwszą wersją że kompilator się burzy |
|
Monika90 |
» 2016-04-24 18:53:01 void preorder() { if( first != NULL ) { cout << first->number << " "; preorder( first->next_left ); preorder( first->next_right ); } } |
|
ast44 Temat założony przez niniejszego użytkownika |
» 2016-04-24 21:57:25 Dzięki.No faktycznie, gapa jestem :P A znasz jakieś proste sposoby z tym wypisywaniem na ekran ? |
|
« 1 » |