Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2003
    Messaggi
    76

    Importante errore su albero binario C++

    ciao ragazzi devo fare un albero binario di caratteri, ho riciclato un mio vecchio albero che avevo fatto al corso di c++ pero' è di interi.
    ho modificato i campi da interi a caratteri pero' c'e' un piccolo problema i dati in ingresso si fermavano dopo il "." ora invece non si ferma piu' come mai?

    Funzionamento albero:
    per ogni inserimento si deve specificare una tripletta:
    -l'informazione da inserire;
    -l'informazione 0 o 1 se è a sinistra o a destra;
    -l'informazione del nodo padre

    per la radice l'inserimento l'inserimento è a sinistra=0 e il nodo padre è 0.
    gli inserimenti terminano con il "."

    esempio con gli interi:

    5 0 0
    2 0 5
    7 1 5
    10 1 2
    -10 1 7.
    visita in ordine anticipato 5 2 10 7 -10
    visita in ordine differito 10 2 -10 7 5
    visita in ordine simmetrico 2 10 5 7 -10

    5
    / \
    2 7
    \ \
    10 -10

    esempio con i caratteri:
    a 0 0
    b 0 a
    c 1 a
    d 1 b
    e 1 c.
    e aspetta ancora un dato perche' non si ferma piu???


    vecchio codice con interi

    #include <iostream>

    using namespace std;

    class btree
    {public:
    enum side{L, R};
    private:
    struct elem
    { int inf;
    elem* l; elem* r;
    };
    elem* root;
    void deltree(elem* p);
    bool ins(elem*p, int s, side sd, int finf);
    void va(elem* p);
    void vd(elem* p);
    void vs(elem* p);
    btree(const btree&);
    btree& operator=(const btree&);

    public:
    btree();
    ~btree();
    bool insert(int s, side sd, int finf);
    void voa();
    void vod();
    void vos();
    };

    void btree::deltree(elem* p)
    { if (p!=0)
    { deltree(p->l); deltree(p->r);
    delete p;
    }
    }

    bool btree::insert(int s,side sd=L, int finf=0)
    { if (root==0)
    { root=new elem;
    root->r=0; root->l=0; root->inf=s;
    return true;
    }
    return ins(root, s, sd, finf);
    }

    bool btree::ins(elem*p, int s, side sd, int finf)
    { if (p==0) return false;
    if (p->inf==finf)
    { switch (sd)
    { case L:
    if (p->l==0)
    { p->l=new elem;
    p->l->r=0; p->l->l=0;
    p->l->inf=s; return true;
    }
    return false;
    case R:
    if (p->r==0)
    { p->r=new elem;
    p->r->r=0; p->r->l=0;
    p->r->inf=s; return true;
    }
    return false;
    }
    }
    else if (ins(p->l,s,sd,finf)==true)
    return true;
    else if (ins(p->r,s,sd,finf)==true)
    return true;
    return false;
    }

    void btree::va(elem* p)
    { if (p!=0)
    { cout<<p->inf<<" ";
    va(p->l);
    va(p->r);
    }
    }

    void btree::vd(elem* p)
    { if (p!=0)
    { vd(p->l);
    vd(p->r);
    cout<<p->inf<<" ";
    }
    }

    void btree::vs(elem* p)
    { if (p!=0)
    { vs(p->l);
    cout<<p->inf<<" ";
    vs(p->r);
    }
    }

    btree::btree()
    { root=0;}
    btree::~btree()
    { deltree(root);}
    void btree::voa()
    { va(root);}
    void btree::vod()
    { vd(root);}
    void btree::vos()
    { vs(root);}

    int main()
    {
    int n1,n2,n3,stop;
    char cc;
    btree::side ss;
    btree tt;
    while (cin>>n1)
    { cin>>n2>>n3;
    ss=(btree::side) n2;
    if (tt.insert(n1,ss,n3))
    cout<<"Inserimento effettuato\n";
    else cout<<"Informazione "<< n3 << " non esistente \n" << " oppure lato occupato\n";
    }
    cin.clear(); cin>>cc;
    if (cc!='.')
    { cout<<"Errore nei dati di ingresso\n";
    return 1;
    }
    cout<<"Visita in ordine anticipato:\n";
    tt.voa(); cout<< '\n';
    cout<<"Visita in ordine differito:\n";
    tt.vod(); cout<< '\n';
    cout<<"Visita in ordine simmetrico:\n";
    tt.vos(); cout<< '\n';
    cin>>stop;
    return 0;
    }

    --------------------------------------
    nuovo codice con caratteri


    #include <iostream>

    using namespace std;

    class btree
    {public:
    enum side{L, R};
    private:
    struct elem
    { char inf;
    elem* l; elem* r;
    };
    elem* root;
    void deltree(elem* p);
    bool ins(elem*p, char s, side sd, char finf);
    void va(elem* p);
    void vd(elem* p);
    void vs(elem* p);
    btree(const btree&);
    btree& operator=(const btree&);

    public:
    btree();
    ~btree();
    bool insert(char s, side sd, char finf);
    void voa();
    void vod();
    void vos();
    };

    void btree::deltree(elem* p)
    { if (p!=0)
    { deltree(p->l); deltree(p->r);
    delete p;
    }
    }

    bool btree::insert(char s,side sd=L, char finf=0)
    { if (root==0)
    { root=new elem;
    root->r=0; root->l=0; root->inf=s;
    return true;
    }
    return ins(root, s, sd, finf);
    }

    bool btree::ins(elem*p, char s, side sd, char finf)
    { if (p==0) return false;
    if (p->inf==finf)
    { switch (sd)
    { case L:
    if (p->l==0)
    { p->l=new elem;
    p->l->r=0; p->l->l=0;
    p->l->inf=s; return true;
    }
    return false;
    case R:
    if (p->r==0)
    { p->r=new elem;
    p->r->r=0; p->r->l=0;
    p->r->inf=s; return true;
    }
    return false;
    }
    }
    else if (ins(p->l,s,sd,finf)==true)
    return true;
    else if (ins(p->r,s,sd,finf)==true)
    return true;
    return false;
    }

    void btree::va(elem* p)
    { if (p!=0)
    { cout<<p->inf<<" ";
    va(p->l);
    va(p->r);
    }
    }

    void btree::vd(elem* p)
    { if (p!=0)
    { vd(p->l);
    vd(p->r);
    cout<<p->inf<<" ";
    }
    }

    void btree::vs(elem* p)
    { if (p!=0)
    { vs(p->l);
    cout<<p->inf<<" ";
    vs(p->r);
    }
    }

    btree::btree()
    { root=0;}
    btree::~btree()
    { deltree(root);}
    void btree::voa()
    { va(root);}
    void btree::vod()
    { vd(root);}
    void btree::vos()
    { vs(root);}

    int main()
    {
    char n1,n3,stop;
    int n2;
    char cc;
    btree::side ss;
    btree tt;
    while (cin>>n1)
    { cin>>n2>>n3;
    ss=(btree::side) n2;
    if (tt.insert(n1,ss,n3))
    cout<<"Inserimento effettuato\n";
    else cout<<"Informazione "<< n3 << " non esistente \n" << " oppure lato occupato\n";
    }
    cin.clear(); cin>>cc;
    if (cc!='.')
    { cout<<"Errore nei dati di ingresso\n";
    return 1;
    }
    cout<<"Visita in ordine anticipato:\n";
    tt.voa(); cout<< '\n';
    cout<<"Visita in ordine differito:\n";
    tt.vod(); cout<< '\n';
    cout<<"Visita in ordine simmetrico:\n";
    tt.vos(); cout<< '\n';
    cin>>stop;
    return 0;
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2003
    Messaggi
    76
    ragazzi aiutatemi voi perche' sto scapocciando

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2003
    Messaggi
    76
    up

  4. #4

    Re: Importante errore su albero binario C++

    Originariamente inviato da leomeya
    ...
    gli inserimenti terminano con il "."
    ...

    ...
    esempio con i caratteri:
    a 0 0
    b 0 a
    c 1 a
    d 1 b
    e 1 c.
    e aspetta ancora un dato perche' non si ferma piu???
    ...
    L' errore è evidenziato in rosso.
    Non puoi inserire due caratteri "c." (qundi una stringa)
    in una varibile (n3) definita come char (singolo carattere)
    che quindi memorizza solo il primo carattere digitato 'c' appunto
    ignorando completamente il '.'
    Infatti se inserisci solo il '.' il programma si interrompe
    regolarmente.
    Credo però che sarebbe meglio effettuare il 'controllo di interruzione' all'inserimento del primo valore, prova a
    cambiare la funzione main così :
    codice:
    int main() 
    { 
    	char n1,n3,stop; 
    	int n2; 
    	char cc; 
    	btree::side ss; 
    	btree tt; 
    	while ( 1 ) 
    	{
    		cin>>n1;
    		if( n1 == '.') break;
    		cin>>n2>>n3; 
    		ss=(btree::side) n2; 
    		if (tt.insert(n1,ss,n3)) 
    		cout<<"Inserimento effettuato\n"; 
    		else cout<<"Informazione "<< n3 << " non esistente \n" << " oppure lato occupato\n"; 
    	} 
    	/* parte da eliminare!
    	cin.clear(); 
    	cin>>cc; 
    	if (cc!='.') 
    	{
    		cout<<"Errore nei dati di ingresso\n"; 
    		return 1; 
    	} // fine parte da eliminare!
    	*/
    	cout<<"Visita in ordine anticipato:\n"; 
    	tt.voa(); cout<< '\n'; 
    	cout<<"Visita in ordine differito:\n"; 
    	tt.vod(); cout<< '\n'; 
    	cout<<"Visita in ordine simmetrico:\n"; 
    	tt.vos(); cout<< '\n'; 
    	cin>>stop;
    	getch();
    	return 0; 
    }
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2003
    Messaggi
    76
    Grazie adesso funziona!
    una domanda se per caso ci inserisco dei numeri ad esempio la sequenza che prima ho usato negli interi non funziona, non dovrebbe riconoscere gli interi come caratteri e funzionare ugualmente?

    esempio precedente:
    5 0 0
    2 0 5
    7 1 5
    10 1 2
    -10 1 7.
    visita in ordine anticipato 5 2 10 7 -10
    visita in ordine differito 10 2 -10 7 5
    visita in ordine simmetrico 2 10 5 7 -10

    PROGRAMMA CORRETTO:

    #include <iostream>

    using namespace std;

    class btree
    {public:
    enum side{L, R};
    private:
    struct elem
    { char inf;
    elem* l; elem* r;
    };
    elem* root;
    void deltree(elem* p);
    bool ins(elem*p, char s, side sd, char finf);
    void va(elem* p);
    void vd(elem* p);
    void vs(elem* p);
    btree(const btree&);
    btree& operator=(const btree&);

    public:
    btree();
    ~btree();
    bool insert(char s, side sd, char finf);
    void voa();
    void vod();
    void vos();
    };

    void btree::deltree(elem* p)
    { if (p!=0)
    { deltree(p->l); deltree(p->r);
    delete p;
    }
    }

    bool btree::insert(char s,side sd=L, char finf=0)
    { if (root==0)
    { root=new elem;
    root->r=0; root->l=0; root->inf=s;
    return true;
    }
    return ins(root, s, sd, finf);
    }

    bool btree::ins(elem*p, char s, side sd, char finf)
    { if (p==0) return false;
    if (p->inf==finf)
    { switch (sd)
    { case L:
    if (p->l==0)
    { p->l=new elem;
    p->l->r=0; p->l->l=0;
    p->l->inf=s; return true;
    }
    return false;
    case R:
    if (p->r==0)
    { p->r=new elem;
    p->r->r=0; p->r->l=0;
    p->r->inf=s; return true;
    }
    return false;
    }
    }
    else if (ins(p->l,s,sd,finf)==true)
    return true;
    else if (ins(p->r,s,sd,finf)==true)
    return true;
    return false;
    }

    void btree::va(elem* p)
    { if (p!=0)
    { cout<<p->inf<<" ";
    va(p->l);
    va(p->r);
    }
    }

    void btree::vd(elem* p)
    { if (p!=0)
    { vd(p->l);
    vd(p->r);
    cout<<p->inf<<" ";
    }
    }

    void btree::vs(elem* p)
    { if (p!=0)
    { vs(p->l);
    cout<<p->inf<<" ";
    vs(p->r);
    }
    }

    btree::btree()
    { root=0;}
    btree::~btree()
    { deltree(root);}
    void btree::voa()
    { va(root);}
    void btree::vod()
    { vd(root);}
    void btree::vos()
    { vs(root);}

    int main()
    {
    char n1,n3,stop;
    int n2;
    char cc;
    btree::side ss;
    btree tt;
    while ( 1 )
    {
    cin>>n1;
    if( n1 == '.') break;
    cin>>n2>>n3;
    ss=(btree::side) n2;
    if (tt.insert(n1,ss,n3))
    cout<<"Inserimento effettuato\n";
    else cout<<"Informazione "<< n3 << " non esistente \n" << " oppure lato occupato\n";
    }
    cout<<"Visita in ordine anticipato:\n";
    tt.voa(); cout<< '\n';
    cout<<"Visita in ordine differito:\n";
    tt.vod(); cout<< '\n';
    cout<<"Visita in ordine simmetrico:\n";
    tt.vos(); cout<< '\n';
    cin>>stop;
    return 0;
    }

  6. #6
    Originariamente inviato da leomeya
    Grazie adesso funziona!
    una domanda se per caso ci inserisco dei numeri ad esempio la sequenza che prima ho usato negli interi non funziona, non dovrebbe riconoscere gli interi come caratteri e funzionare ugualmente?

    esempio precedente:
    5 0 0
    2 0 5
    7 1 5
    10 1 2
    -10 1 7.
    visita in ordine anticipato 5 2 10 7 -10
    visita in ordine differito 10 2 -10 7 5
    visita in ordine simmetrico 2 10 5 7 -10
    ...
    Forse non hai ben capito qual'era il problema precedente.
    ...
    char n1,n3,stop;
    int n2;
    ...
    Se dichiari n1 e n3 come char, non puoi inserirci ne
    una stringa ne un valore intero con la cin, ma
    soltanto UN SOLO carattere ,il primo presente sulla riga di input.
    Se digiti '-10' memorizzi solo il carattere '-' e la
    variabile conterrà 45 il valore ASCII corrispondente.
    Per gli interi devi utilizzare gli int come nel
    programma originale.

    PS.
    Racchiudi il codice nei tag [*CODE]...[*/CODE] (senza gli asterischi)
    Il codice sarà meno faticoso da leggere
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2003
    Messaggi
    76
    ciao ragazzi c'e' un nuovo problema se inserisco dei caratteri uguali nei nodi non funziona

    è CORRETTO se le lettere nei nodi sono tutte diverse
    triplette da inserire:
    a 0 0
    b 0 a
    c 1 a
    d 1 b
    e 1 c.

    albero risultante:
    a
    / \
    b c
    \ \
    d e

    è ERRATO se ci sono lettere uguale nei nodi
    triplette da inserire:
    a 0 0
    a 0 a
    a 1 a
    inserisce i due successori del nodo radice "a" e se adesso faccio inserire un altro nodo "a" sotto al precedente, lui controlla solo la radice, vede che c'e' un nodo con campo "a" pieno in entrambi i lati e non me ne fa inserire altri. SI FERMA QUI
    a 1 a
    a 1 a.

    io invece devo essere in grado di fare un albero anche di questo tipo!

    albero risultante:
    a
    / \
    a a
    \ \
    a a

    Come posso fare io devo poter inserire anche lettere uguali nei nodi successori




    codice:
    #include <iostream>
    
    /* 
    SPIEGAZIONE:
    Per ogni inserimento si deve specificare una tripletta: 
    -l'informazione carattere da inserire; 
    -l'informazione 0 o 1 se è a sinistra o a destra del nodo padre; 
    -l'informazione carattere del nodo padre. 
    
    Per la radice dell'albero l'inserimento è a sinistra=0 e il nodo padre è 0. 
    Gli inserimenti terminano con il ".".
    
    ESEMPIO:
    triplette da inserire: 
    a 0 0 
    b 0 a 
    c 1 a 
    d 1 b 
    e 1 c.
    
    albero risultante:
           a 
          / \ 
         b   c 
          \   \ 
           d   e 
    
    visita in ordine anticipato a b d c e
    visita in ordine differito d b e c a 
    visita in ordine simmetrico b d a c e
    */
        
         
    
                
    using namespace std;
    
    class btree
    {public:
    enum side{L, R};
    private:
       struct elem
         { char inf;
           elem* l; elem* r;
         };
       elem* root;
       void deltree(elem* p);
       bool ins(elem*p, char s, side sd, char finf);
       void va(elem* p);
       void vd(elem* p);
       void vs(elem* p);
       btree(const btree&);
       btree& operator=(const btree&);
    
    public:
       btree();
       ~btree();
       bool insert(char s, side sd, char finf);
       void voa();
       void vod();
       void vos();
       };
    
    void btree::deltree(elem* p)
     { if (p!=0)
           { deltree(p->l); deltree(p->r);
             delete p;
           }
     }
     
    bool btree::insert(char s,side sd=L, char finf=0)
     { if (root==0)
           { root=new elem;
             root->r=0; root->l=0; root->inf=s;
             return true;
           }
       return ins(root, s, sd, finf);
     }
     
    bool btree::ins(elem*p, char s, side sd, char finf)
     { if (p==0) return false;
       if (p->inf==finf)
           { switch (sd)
               { case L:
                   if (p->l==0)
                       { p->l=new elem;
                         p->l->r=0; p->l->l=0;
                         p->l->inf=s; return true;
                       }
                   return false;
                 case R:
                    if (p->r==0)
                       { p->r=new elem;
                         p->r->r=0; p->r->l=0;
                         p->r->inf=s; return true;
                       }
                   return false; 
                }
            }
       else if (ins(p->l,s,sd,finf)==true) 
                return true;
       else if (ins(p->r,s,sd,finf)==true) 
                return true;
       return false;
     }
     
    void btree::va(elem* p)
     { if (p!=0)
          { cout<<p->inf<<" ";
            va(p->l);
            va(p->r);
          }
     }
     
    void btree::vd(elem* p)
     { if (p!=0)
          { vd(p->l);
            vd(p->r);
            cout<<p->inf<<" ";
          }
     }
     
    void btree::vs(elem* p)
     { if (p!=0)
          { vs(p->l);
            cout<<p->inf<<" ";
            vs(p->r);
          }
     }
     
    btree::btree()
     { root=0;}
    btree::~btree()
     { deltree(root);}
    void btree::voa()
     { va(root);}
    void btree::vod()
     { vd(root);}
    void btree::vos()
     { vs(root);}
    
    int main() 
    { 
    char n1,n3,stop; 
    int n2; 
    char cc; 
    btree::side ss; 
    btree tt; 
    while ( 1 ) 
    {
    	cin>>n1;
    	if( n1 == '.') break;
    	cin>>n2>>n3; 
    	ss=(btree::side) n2; 
    	if (tt.insert(n1,ss,n3)) 
    	cout<<"Inserimento effettuato\n"; 
    	else cout<<"Informazione "<< n3 << " non esistente \n" << " oppure lato occupato\n"; 
    } 
    cout<<"Visita in ordine anticipato:\n"; 
    tt.voa(); cout<< '\n'; 
    cout<<"Visita in ordine differito:\n"; 
    tt.vod(); cout<< '\n'; 
    cout<<"Visita in ordine simmetrico:\n"; 
    tt.vos(); cout<< '\n'; 
    cin>>stop;
    return 0; 
    }
    RAGAZZI sono nella confusione piu' totale

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.