provo a perdere un pò di tempo vediamo se riesco a farti capire qualcosa in più..
nel listato di sopra c'è un errore di fondo... ovvero se tu passi il puntatore come reference di un puntatore non serve che ritorni il puntatore a fine metodo.. questo perchè le reference vanno a modificare direttamente il puntatore che tu passi al metodo (invece di farne uno nuovo con uguale valore).
Quindi puoi passare il metodo come void invece di ritornare il puntatore che hai passato come reference.
comunque il problema per cui non si ferma nel printare i dati è che non abbiamo portato a null il puntatore , svista davvero stupida (io sono stupido)
nuovo metodo cancella albero:
non portare a NULL il puntatore comporta che il puntatore continua a puntare su memoria non più allocata..
il puntatore altro non è che un numero (occupa due byte nella maggior parte delle architetture quindi è qualcosa di simile a un unsigned short)
se non lo porti a NULL (che sarebbe 0) il suo valore continua ad essere quello di un indirizzo di memoria (ad esempio 0x736476) che continuerà a != NULL , quindi nel tuo check if(albero == NULL) in stampa_albero l'if non sarebbe stato true ma false
C++:
Albero crea_albero(Albero &albero, int numero)
{
if(albero == NULL)
{
albero = new nodo;
albero->data = numero;
albero->sx = NULL;
albero->dx = NULL;
}
else
{
if(albero->data >= numero)
{
crea_albero(albero->sx, numero);
}
else
{
crea_albero(albero->dx, numero);
}
}
return (albero);
}
nel listato di sopra c'è un errore di fondo... ovvero se tu passi il puntatore come reference di un puntatore non serve che ritorni il puntatore a fine metodo.. questo perchè le reference vanno a modificare direttamente il puntatore che tu passi al metodo (invece di farne uno nuovo con uguale valore).
Quindi puoi passare il metodo come void invece di ritornare il puntatore che hai passato come reference.
comunque il problema per cui non si ferma nel printare i dati è che non abbiamo portato a null il puntatore , svista davvero stupida (io sono stupido)
nuovo metodo cancella albero:
C++:
void cancella_albero(Albero &albero)
{
if(albero == NULL)
{
return;
}
cout << "elimino l'albero 0x" << albero << endl;
if(albero->sx)
{
cancella_albero(albero->sx);
}
if(albero->dx)
{
cancella_albero(albero->dx);
}
delete albero;
albero = NULL;
}
non portare a NULL il puntatore comporta che il puntatore continua a puntare su memoria non più allocata..
il puntatore altro non è che un numero (occupa due byte nella maggior parte delle architetture quindi è qualcosa di simile a un unsigned short)
se non lo porti a NULL (che sarebbe 0) il suo valore continua ad essere quello di un indirizzo di memoria (ad esempio 0x736476) che continuerà a != NULL , quindi nel tuo check if(albero == NULL) in stampa_albero l'if non sarebbe stato true ma false