Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Błąd z dopasowaniem funkcji i wypisywanie drzewa na ekran.

Ostatnio zmodyfikowano 2016-04-24 21:57
Autor Wiadomość
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:

C/C++
#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

C/C++
#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
P-147607
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ą

C/C++
void preorder()
{
    preorder( first );
}
P-147608
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
P-147612
Monika90
» 2016-04-24 18:53:01
C/C++
void preorder() //ta funkcja nie przyjmuje żadnych argumentów
{
    if( first != NULL )
    {
        cout << first->number << " ";
        preorder( first->next_left ); //a tu próbujesz ją wywołać z argumentem
        preorder( first->next_right );
    }
}
P-147614
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 ?
P-147621
« 1 »
  Strona 1 z 1