Visualizzazione dei risultati da 1 a 10 su 10

Hybrid View

  1. #1
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    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);
    }
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2017
    Messaggi
    11
    Quote Originariamente inviata da shodan Visualizza il messaggio
    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);
    }
    Nada anche cosi ha sempre il problema del segmentation fault, tra l'altro le varie condizioni impostate negli if non dovrebbero impedire una loro esecuzione in sequenza?

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 © 2026 vBulletin Solutions, Inc. All rights reserved.