No, mi riferisco a questo:
codice:
void cancellazione_elemento(tree Y, int elem)
{
if(Y->value < elem)
cancellazione_elemento(Y->dx, elem);
if(Y->value > elem)
cancellazione_elemento(Y->sx, elem);
else//se Y->value risulta uguale all elemento che vogliamo eliminare
{
if(Y->sx == NULL && Y->dx == NULL)
{
free(Y);
Y=NULL;
}
if(Y->sx != NULL && Y->dx == NULL) /* prossima istruzione eseguita */
{
Y->value = Y->sx->value;
free(Y->sx);
Y->sx=NULL;
}
if(Y->sx == NULL && Y->dx != NULL)
{
Y->value = Y->dx->value;
free(Y->dx);
Y->dx=NULL;
}
if(Y->sx != NULL && Y->dx != NULL)
printf("Non posso eliminare questo nodo poichè entrambi i suoi rami contengono dei dati!\n");
}
stampa_tutto(Y);
}
Se annulli il puntatore, dereferiarlo implica un crash. Se liberi il puntatore e non lo annulli, hai comunque un crash perché dopo hai qualcosa di non più valido. E questo succede perché i vari if non sono esclusivi, ma sono eseguiti in sequenza.
Basta aggiungere un else
codice:
void cancellazione_elemento(tree Y, int elem)
{
if(Y->value < elem)
cancellazione_elemento(Y->dx, elem);
if(Y->value > elem)
cancellazione_elemento(Y->sx, elem);
else//se Y->value risulta uguale all elemento che vogliamo eliminare
{
if(Y->sx == NULL && Y->dx == NULL)
{
free(Y);
Y=NULL;
}
else if(Y->sx != NULL && Y->dx == NULL)
{
Y->value = Y->sx->value;
free(Y->sx);
Y->sx=NULL;
}
else if(Y->sx == NULL && Y->dx != NULL)
{
Y->value = Y->dx->value;
free(Y->dx);
Y->dx=NULL;
}
else if(Y->sx != NULL && Y->dx != NULL)
printf("Non posso eliminare questo nodo poichè entrambi i suoi rami contengono dei dati!\n");
}
stampa_tutto(Y);
}