|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Sep 2001
Messaggi: 1302
|
Aiuto errore albero binario C++!please help me
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 |
Senior Member
Iscritto dal: Sep 2001
Messaggi: 1302
|
perche' non mi si ferma piu'
![]() ![]() sto scapocciando ![]() |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Sep 2001
Messaggi: 1302
|
up
|
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Apr 2004
Messaggi: 130
|
Il punto e' che non riesce a distinguere tra 'a' e '.', mentre prima distingueva tra un intero e '.'.
Prova a scrivere qualcosa tipo: Codice:
... while (cin >> n1) { if (n1 == '.') break; ... |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Sep 2001
Messaggi: 1302
|
grazie mille
![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:05.