No, mi riferisco a questo:
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.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); }
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); }

Rispondi quotando