Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [C] Canc elem dispari da Lista

    Salve a tutti, ho implementato una funzione che data in ingresso una lista ordinata restituisce la lista senza i nodi che contengono i numeri pari al suo interno.In sostanza la funzione itera tramite un while e appena trova un elemento dispari nel nodo lo elimina.La stuttura interna si divide in due casi, la cancellazione in testa e quella non in testa alla lista.
    Quando chiamo la funzione oltre ai valori corretti mi stampa anche dei valori casuali e non riesco a capire il perchè.
    Posto il codice della funzione.



    codice:
    Tipo_lista cancella_tutti_pari(Tipo_lista l)
    {
     Tipo_lista Prec, Succ;
     Prec = NULL;
     Succ = l;
     if (Succ == NULL)
      return l;
     while (Succ != NULL)
      {
         if (Succ->Value %2 == 0)
            {
             Tipo_lista Temp = NULL;
              if (Prec == NULL)
                 {
                  Temp = l;
                  l = Succ->Next;
                  free(Temp);
                  }
              else
                  {
                  Temp = Succ;
                  Succ = Succ->Next;
                  free(Temp);
                  }
             }
           else
             {
             Prec = Succ;
             Succ = Succ->Next;
             }
       }
         return l;
     }

    posto anche la definizione della stuttura, i prototipi, il main e le altre due funzioni di stampa e di inserimento.

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    // definizione della struttura
    
    struct Tag_nodo
    {
     int Value;
     struct Tag_nodo *Next;
    };
    
    typedef struct Tag_nodo Tipo_nodo;
    typedef Tipo_nodo *Tipo_lista;
    
    // prototipi delle funzioni
    
    Tipo_lista insert(Tipo_lista l, int val);
    Tipo_lista cancella_tutti_pari(Tipo_lista l);
    void stampa(Tipo_lista l);
    
    //main
    
    int main()
    {
      Tipo_lista l = NULL;
    
      l = insert(l, 3);
      l = insert(l, 6);
      l = insert(l, 8);
      l = insert(l, 5);
      l = insert(l, 12);
      
    
      stampa(l);
    
      l = cancella_tutti_pari(l);
    
      stampa(l);
    
          system("PAUSE");
          return 0;
    }
    
    Tipo_lista insert(Tipo_lista l, int val)
     {
       if ((l == NULL) || (l->Value > val))    
         {
          Tipo_lista Temp;
          Temp = (Tipo_lista)malloc(sizeof(Tipo_nodo));
          if (Temp == NULL)
           {
            printf("Errore di allocazione nodo nella memoria");
            exit(1);
           }
           Temp->Value = val;
           Temp->Next = l;
           return Temp;
           }
       else
        {
         l->Next = insert(l->Next, val);
         return l;
        }
      }
    
    
    
    
    void stampa(Tipo_lista l)
    {
     if (l == NULL)
       printf("Lista vuota\n");
     else
      {
        while ( l != NULL)
         {
          printf("%d\n", l->Value);
          l = l->Next;
         }
      }
    }


    grazie
    non si finisce mai di imparare !

    www.motogatti.it

  2. #2
    I valori 'anomali' che hai segnalato erano dovuti al fatto che cancellavi i nodi ma dopo non collegavi quelli dispari tra di loro .
    Ecco il codice della funzione modificato .

    codice:
    Tipo_lista cancella_tutti_pari(Tipo_lista l)
    {
     Tipo_lista Prec, Succ,Tmp;  // inserita una nuova variabile Tmp
     Prec = NULL;
     Succ = l;
     if (Succ == NULL)
      return l;
     while (Succ != NULL)
      {
    	if (Prec !=NULL)        // modifica
    	Tmp  = Prec;            // modifica
         if (Succ->Value %2 == 0)
            {
             Tipo_lista Temp = NULL;
              if (Prec == NULL)
                 {
                  Temp = l;
                  l = Succ->Next;
                  }
              else
                  {
                  Temp = Succ;
                  Succ = Succ->Next;			  
                  }
    			free(Temp);	   //	modifica
    			Tmp->Next = Succ;  //   modifica
             }
           else
             {
             Prec = Succ;
             Succ = Succ->Next;
             }
       }
         return l;
     }

  3. #3

    Grazie

    Davvero gentile king64.

    In effetti dimenticavo di aggiornare il puntatore del nodo di "coda" e quindi puntava ad un valore inesistente.
    Se mi permetti ti faccio un piccolo appunto, semplicemente per il piacere di discutere e di capire.

    Ragionandoci un po sopra vorrei farti notare che hai inserito la variabile tmp che si poteva evitare, in quanto, Prec nel ciclo if non viene modificato per cui il suo puntatore rimane lo stesso finchè i valori sono pari.Lo stesso vale per la condizione che hai inseito "if (Prec !=NULL)" che ridonda in quanto tale condizione è già all'interno dell'if-else, in particolare nel ramo else:

    codice:
    if (Prec == NULL)
                 {
                  Temp = l;
                  l = Succ->Next;              }
              else
                  {
                  Temp = Succ;
                  Succ = Succ->Next;			  
                  }
    in conclusione bastava aggiornare il puntatore "di coda" Precc in modo che puntasse al nuovo nodo di Succ, solo nel caso in cui la cancellazione non avviene in testa.A finale bastava inserire semplicemente l'aggiornamento in questo modo:

    codice:
    Tipo_lista cancella_tutti_pari(Tipo_lista l)
    {
     Tipo_lista Prec, Succ;
     Prec = NULL;
     Succ = l;
     if (Succ == NULL)
      return l;
     while (Succ != NULL)
      {
         if (Succ->Value %2 == 0)
            {
             Tipo_lista Temp = NULL;
              if (Prec == NULL)
                 {
                  Temp = l;
                  l = Succ->Next;
                  }
              else
                  {
                  Temp = Succ;
                  Succ = Succ->Next;
                  Prec->Next = Succ; // MODIFICA
                  }
               free(Temp);
             }
           else
             {
             Prec = Succ;
             Succ = Succ->Next;
             }
       }
         return l;
     }

    Ancora grazie.
    non si finisce mai di imparare !

    www.motogatti.it

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