Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    65

    creare lista ricorsivamente in c

    ciao ragazzi sono nuovo del forum ed ho questo problema: voglio creare una lista ricorsivamente in c ma mi restituisce sempre il puntatore a null.

    codice:
    struct elemento*crea_lista(struct elemento*testa,struct elemento*app, int n)
    {
      if (n==0)
        return testa;
      else
        {
         if (testa==NULL)
           {    
             testa=(struct elemento*)malloc(sizeof(struct elemento));  
             testa->inf=3;
             app=testa;
             app->next=crea_lista(testa,app,n-1);
           }
         else
           {   
            app=(struct elemento*)malloc(sizeof(struct elemento));
            app->inf=4;
            app->next=crea_lista(testa,app,n-1);
           }
        }
    }
    dimenticavo N numero di elemento della lista e testa e app vengono preinizializzati a NULL nel main

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    65
    ragazzi non riesco a capire dove sbaglio qualcuno puo darmi una mano

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Se n == 0, ritorna testa. Ma se n != 0? Cosa ritorna la tua funzione?

    Credo che il compilatore dovrebbe darti un "warning: missing return in function returning non-void", il che significa che manca il return in una funzione che deve ritornare un valore.
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    65
    richiamo fino a quando il numero di elementi decrementandosi arriva a 0. altrimenti come posso fare la chiamata ricorsiva?

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    codice:
    app->next=crea_lista(testa,app,n-1);
    Guarda bene questa linea (è nel primo if). Supponiamo che n valga 1: perciò, la chiamata viene fatta con n = 0, e quindi crea_lista ritorna null, il che ci porta ad avere che app->next = NULL, e fin qui tutto bene.

    Ora supponiamo che n sia maggiore di 1, ad esempio che valga 2. A cosa dovrebbe puntare app->next, e quale valore gli viene assegnato dalla tua funzione?
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    65
    scusa ma non capisco neanche con 1 funziona ritorna sempre NULL. io usa quell istruzione per la ricorsione in modo che l ultima chiamata dovrebbe essere NULL e le altre dovrebbero rimanere con quei valori prima della chiamata ricorsiva. non riesco a capire quale istruzione dovrei mettere al posto di quella chiamata. mi spieghi meglio grazie????

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Originariamente inviato da mame83 non riesco a capire quale istruzione dovrei mettere al posto di quella chiamata.
    Quella chiamata ci deve essere, altrimenti non c'è ricorsione. Quello che sto cercando di farti capire è che la chiamata ricorsiva non ritorna nessun valore al suo chiamante, ed è per questo che non funziona.

    La chiamata ricorsiva dovrebbe ritornare al chiamante l'indirizzo della lista creata, mentre tu semplicemente non ritorni nulla, e quindi il valore di ritorno è indefinito.
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    65
    scusa ma allora come potrei fare per far ritornare il valore della testa ??? forse è sbagliato mettere return testa quando n==0? se si dove va messo? ti prego aiutami perche non so più cosa fare.

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    codice:
    if (n == 0) return NULL
    else
    {
        ...
        return app;
    }
    Ovviamente, ogni chiamata deve ritornare il nodo che ha creato: se non sono stati creati nodi ritorna NULL, se ha creato un nodo deve ritornare quel nodo (ovviamente dopo aver chiamato ricorsivamente la funzione per creare il resto della lista).
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  10. #10
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    65
    GRAZIE funziona. ho provato a fare una modifica cioè senza usare il puntatore di appoggio ma solo testa e funziona lo stessa.
    codice:
    struct elemento*crea_lista(struct elemento*testa, int n)
    {
      if (n==0)
        return NULL;
      else
        {
         testa=(struct elemento*)malloc (sizeof(struct elemento));
         testa->inf=4;
         testa->next=crea_lista(testa,n-1);
         return testa;
        }
    }

    Secondo te va bene lo stesso???

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.