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
    Nel tuo codice originale no, dato che ogni if viene controllato a prescindere dal precedente. Mettendo l'else, invece, il primo if verificato bypassa gli altri.
    Tra l'altro c'è un errore subdolo in quella funzione: ossia che i vari annullamenti dei puntatori rimangono locali alla funzione, per cui quando si entra in uno dei rami ricorsivi e poi se ne esce, i puntatori ->dx o ->sx non sono NULL, ma non sono nemmeno più validi. Il che significa che oltre a fallire i controlli, si fa la free() di un puntatore sporco.
    Per trasmettere le modifiche all'esterno è necessario passare un puntatore al puntatore.
    La sintassi è quella che è, però modificando così non ho avuto più problemi:
    codice:
    void cancellazione_elemento(tree* Y, int elem)
    {
        if ((*Y)->value < elem)
            cancellazione_elemento(&(*Y)->dx, elem);
        else 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
    Nel tuo codice originale no, dato che ogni if viene controllato a prescindere dal precedente. Mettendo l'else, invece, il primo if verificato bypassa gli altri.
    Tra l'altro c'è un errore subdolo in quella funzione: ossia che i vari annullamenti dei puntatori rimangono locali alla funzione, per cui quando si entra in uno dei rami ricorsivi e poi se ne esce, i puntatori ->dx o ->sx non sono NULL, ma non sono nemmeno più validi. Il che significa che oltre a fallire i controlli, si fa la free() di un puntatore sporco.
    Per trasmettere le modifiche all'esterno è necessario passare un puntatore al puntatore.
    La sintassi è quella che è, però modificando così non ho avuto più problemi:
    codice:
    void cancellazione_elemento(tree* Y, int elem)
    {
        if ((*Y)->value < elem)
            cancellazione_elemento(&(*Y)->dx, elem);
        else 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));
    }
    Il codice ora fa quel che deve senza crash di sorta. Questo metodo del puntatore a puntatore non l'hanno mai mostrato però se questa è la sua efficacia converrà usarlo con regolarità su funzioni simili. Ad ogni modo grazie dell'assistenza

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.