Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2012
    Messaggi
    53

    [C]Problema strutture ricorsive

    Ciao a tutti! Ecco il mio problema:

    -Questa è la struttura in questione:
    codice:
    typedef struct lista_elem
    {
         int value;
         struct lista *next;
    }lista_elem_t;
    -Questo è il codice per creare la lista di elementi dove ad ogni elementi viene assegnato un intero crescente:

    codice:
        lista_elem_t *elem;
        lista_elem_t *p;
    
        p=(vertice_grafo_t *)malloc(sizeof(vertice_grafo_t));
        /*testa lista*/
        elem = p;
        for(i=0;i<NUM;i++)
        {
                p->code = i;
                p->next=(lista_elem_t *)malloc(sizeof(lista_elem_t));
                p = p->next;
     
        }
    -Poi ho provato a stamparli in questo modo:
    codice:
        int i=0;
        
        while(i<NUM)
        {
            p=elem;
            printf("Code: %d\n", p->code);
            p=p->next;
            i++;
        }
    L'output a video sono tutti zeri invece di 0,1,2,...,NUM-1. Dove sbaglio??

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    p = elem dev'essere esterno al while.
    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.

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2012
    Messaggi
    53
    Grazie mille!

    PS: per rendre più genercio possibile il tutto ho voluto sostisuire il while con un for sugli indirizzi:

    codice:
        for(p=elem;p!=NULL;p=p->next)
        {
            printf("Code: %d\n", p->code);
        }
    Compila correttamente ma al lancio dell'applicazione stampa tutti i valori, sfora in un indirizzo ignoto, lo stampa e poi crasha, perchè?

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Perché in fase di inserimento dei valori non metti l'ultimo elemento della lista a NULL.
    Dovrebbe essere sufficente inserire come ultma istruzione del for()
    p->next = NULL
    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.

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2012
    Messaggi
    53
    Ho provato a inserire quella riga qui:
    codice:
        lista_elem_t *elem;
        lista_elem_t *p;
    
        p=(vertice_grafo_t *)malloc(sizeof(vertice_grafo_t));
        /*testa lista*/
        elem = p;
        for(i=0;i<NUM;i++)
        {
                p->code = i;
                p->next=(lista_elem_t *)malloc(sizeof(lista_elem_t));
                p = p->next;
                p->next = NULL; /* <==========INSERITO QUI*/
     
        }
    Il risultato è che non crasha più però stampa un numero fuori dai limiti, ES: 0,1,2,3,4,5,6,15487621.
    Si può rimediare?

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2012
    Messaggi
    53
    Ho fatto qualche prova ed alla fine sono giungo qua:
    codice:
        lista_elem_t *elem;
        lista_elem_t *p;
    
        p=(lista_elem_t *)malloc(sizeof(lista_elem_t));
        /*testa lista*/
        elem = p;
        for(i=0;i<NUM;i++)
        {
    
                p->next=(lista_elem_t *)malloc(sizeof(lista_elem_t));
                p = p->next;
                p->code = i;
                p->next = NULL;
     
        }
    
    /*STAMPA STRUTTURA*/ 
        for(p = elem->next; p != NULL; p = p->next)
        {
            printf("Code: %d\n", p->code);
        }
    Così facendo ho fatto in modo che la testa della lista sia composta solo da un puntatore al primo vero elemento, e quando vado a scorrere la lista per un qualsiasi uso (in questo caso la stmpa) parto dal secondo elemento inizializzando p = elem->next.
    E' una cosa che può andare bene o è un insulto al linguaggio C?

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Mi sono permesso di sistemarti il codice, con il problema della testa, ciao.

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    #define NUM 10
    
    struct lista_elem {
        int code;
        struct lista_elem *next;
    };
    
    typedef struct lista_elem lista_elem_t;
    
    int main()
    {
        lista_elem_t *testa, *p;
        int i;
    
        testa = p = (lista_elem_t *)malloc(sizeof(lista_elem_t));
        p->code = 0;
        
        for (i = 1; i < NUM; i++) {
            p->next = (lista_elem_t *)malloc(sizeof(lista_elem_t));
            p = p->next;
            p->code = i;
            p->next = NULL;
        }
    
        for (p = testa; p != NULL; p = p->next)
            printf("code: %d\n", p->code);
    
        return 0;
    }

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2012
    Messaggi
    53
    Originariamente inviato da c0der
    Loso anche io avevo pensato di fare una cosa del genere però così il primo elemento della lista avrà sempre il valore 0.
    Io qua ho semplificato la struttura ed il codice, ed in realtà nel mio caso il modello in cui il primo elemento della lista abbia valore 0 ,sempre e comunque, va stretto!

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Ho messo 0 ma puoi mettere quello che vuoi, sostituendo:
    p->code = 0;
    con
    p->code = altro_valore_o_valore_di_ritorno_funzione_o_altra_ variabile;
    Non vedo il problema.

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2012
    Messaggi
    53
    Hai ragione!!! Grazie mille!

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