Creazione nodo

di il
10 risposte

Creazione nodo

Salve raga sto creando una lista a puntatori ho difficoltà ad aggiungere i nodi il programma mi sbomba(va in crash) sulla penultima istruzione
questa è la struttura


struct nodo{
char info[20];
struct nodo*next;

}inizio;



struct nodo*inserisci(char stringa[])
{struct nodo *inizio;
    inizio=&lista;
    if(inizio==NULL)
    {
        strcpy(inizio->info,stringa);
       inizio= creanodo(inizio);
        return inizio;
    }

    
    else
    {
        while(inizio!=NULL)
        {
            inizio=inizio->next;
            
            
        }
        inizio=creanodo(inizio);
        
    
        
    
    
    }
    return inizio;




}

struct nodo* creanodo(struct nodo*inizio)
{

    
    struct nodo*new;
    new=(struct nodo*)malloc(sizeof(struct nodo));
    new->next=NULL;
    inizio->next=new;// qui il mio programma muore
    return inizio;




}
ditemi dove sbaglio grazie

10 Risposte

  • Re: Creazione nodo

    Allora ascolta c'è un problema di fondo. Se stai cercando di creare una lista
    
    //la parte di collegamento che tu hai chiamato struct nodo*inserisci non va bene così
    
    struct nodo* creanodo(struct nodo*inizio)
    {   
        struct nodo*new;
        new=(struct nodo*)malloc(sizeof(struct nodo));
        new->next=NULL;
        inizio->next=new;  //per forza che muore, inizio è un puntatore e non ha un campo ->next 
        return inizio;
    }
    
    Qua posto il codice esatto
    
    struct nodo* creanodo()
    {   
        struct nodo*new;
        new=(struct nodo*)malloc(sizeof(struct nodo));
        new->next=NULL;
        return new;  //così ritorni new e non devi passare nessun parametro alla funzione
    }
    
    Nella parte dell'inserzione non ho capito bene se devi proprio creare una lista dal nulla o se devi solo aggiungere un nodo in coda alla lista. Dimmi cosa devi fare con precisione che ti aiuto!
  • Re: Creazione nodo

    Devo creare una lista ogni volta che la chiamo devo aggiungere un nodo grazie per l'aiuto
  • Re: Creazione nodo

    Ma scusa inizio è un puntatore al tipo struct nodo quindi perché non è lecito usarlo in questo modo?
  • Re: Creazione nodo

    Non puoi usarlo in quel modo perchè tu hai dichiarato il puntatore ma esso non punta ancora a nulla. quando tu fai la return new e dal main scrivi:
    
    main(){
    struct nodo *inizio; //dichiri un puntatore a struct nodo
    //qui inizio non punta a nulla quindi non puoi accedere al campo di una struttura che non esiste 
    inizio = creanodo(); //adesso inizio punta al nodo!!
    ...
    }
    
    Capito? Il puntatore è una cosa, la struct nodo un'altra. Il puntatore tiene solo un indirizzo di memoria mentre la struttura puntata è ciò che c'è dentro a quell'indirizzo di memoria. Facendo "puntatore->info" fai la stessa cosa che faresti a fare (*puntatore).info.
    *puntatore è il puntatore dereferenziato(cioè proprio la variabile stuct nodo) e con .info accedi ad un campo della struttura. E una cosa non troppo banale. Anch'io facevo il tuo errore ma è sempre la stessa cosa! Tipo anche per copiare una struttura:
    
    struct nodo *inizio, *nuovo;
    inizio = creanodo();
    nuovo = inizio; //così i 2 puntatiri puntano alla stessa struttura(sono due indirizzi uguali)
    //per fare una copia dell'intera stuttura devi fare così
    nuovo->info = inizio->info;
    nuovo->next = inizio->next;
    


    Beh comunque stavo solo cercando di farti capire meglio.
    Ora..
    Quello che volevi fare tu con struct nodo *inserisci è inserire ogni volta un elemento in coda alla lista che è abbastanza facile! Una cosa che ha sbagliato è che oltre a passare alla funzione la stringa con cui riempire il campo info devi anche passare il puntatore alla testa della lista a cui vuoi attaccare il nuovo nodo.
    
    void inserisci(char stringa[], nodo *inizio){
         struct nodo *nuovo = creanodo(); //nuovo punta al nodo appena creato
         strcpy(nuovo->info,stringa);  //riempi il campo info del nodo appena creato
         while(inizio != NULL){
             inizio = inizio->next
         } 
    //a questo punto sei alla fine della lista dove il campo next dell'ultimo nodo è = NULL
    //nota che se inizio era uguale a NULL non entravi nemmeno nel ciclo quindi in questo modo non
    //ti serve distinguere più casi
         inizio = nuovo; //attacchi il nodo creato in coda alla lista
    }
    


    Ho fatto una funzione void perchè non ti serve ritornare nulla! Il puntatore passato nel main non cambia perchè è stato passato per valore, e quando scorrerai la lista troverai anche l'ultimo nodo attaccato.
    Tutto chiaro o c'è ancora qualche problema?
  • Re: Creazione nodo

    Lo stesso non mi funziona ti posto il mio nuovo sorgente
    
    
    
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    struct nodo{
        char info[20];
        struct nodo*next;
    
    };
    
    
    void stampa(struct nodo*);//gli passo inizio;
    void inserisci(struct nodo*,char[20]);  // inizio lista e la stringa;
    struct nodo* creanodo();
    
    int main(void)
    {
        struct nodo *inizio;
        char string[20];
        inizio=creanodo();
        for(int i=0;i<3;i++){
        printf("inserisci la stringa\n");
        scanf("%s",string);
        inserisci(inizio,string);
        }
        stampa(inizio);
    }
    
    
    
    struct nodo *creanodo()
    {
        struct nodo *app;
        app=(struct nodo*)malloc(sizeof(struct nodo));
        return app;
    
    }
    
    
    
    void inserisci(struct nodo *inizio,char string[])
    {
        struct nodo *app;
        app=creanodo();// do memoria a app;
        strcpy(app->info,string);
        while(inizio!=NULL)
        {
            inizio=inizio->next;
        }
        inizio=app;
        free(app);
    }
    
    void stampa(struct nodo *inizio)
    {struct nodo *app;
        app=inizio;
    while(app!=NULL)
    {
        printf("%s",app->info);
        app=app->next;
    }
    
    
    }
    
    
    
  • Re: Creazione nodo

    Questo è il mio nuovo sorgente ancora non funziona!!
    
    
    
    void stampa(struct nodo*);//gli passo inizio;
    struct nodo* inserisci(struct nodo*,char[20]);  // inizio lista e la stringa;
    struct nodo *creanodo();
    
    int main(void)
    {
       int scelta;
        
        struct  nodo*inizio = NULL;// compilatore esigente
        char string[20];
        inizio=creanodo();
        strcpy(inizio -> info,  "Primo nodo");// evito spazzatura
        inizio -> next = NULL;   // tappo la lista evito di fare booommmbbbbeee
        for(scelta=0;scelta<3;scelta++)
        {
        printf("inserisci la stringa\n");
        scanf("%s",string);
       inizio= inserisci(inizio,string);
          
           
        }
        stampa(inizio);
    }
    
    
    
    struct nodo  * creanodo()
    {
        struct nodo *app;
            
        
        
        app=(struct nodo*)malloc(sizeof(struct nodo));
        app->next=NULL;
        
        return app;
    
    }
    
    
    
    struct nodo* inserisci(struct nodo *inizio,char string[])
    {
        struct nodo *app;
        app=creanodo();// do memoria a app;
        strcpy(app->info,string);
        while(inizio!=NULL)
        {
            inizio=inizio->next;  // questo ciclo non scorre come dovrebbe  viene eseguito sempre 1 volta
        }
        inizio=app;// inizio->info ha il giusto valore subito dopo lo perde ecco perché è diventata una funzione con il return 
       // free(app); non uso la free i dati mi servono!
    
        return inizio;
    }
    
  • Re: Creazione nodo

    Così funziona. Il problema stava nella funzione inserisci perchè facendo inizio = app, inizio si puntava al nodo puntato da app per in realtà il campo next del nodo prima non cambiava. Beh con un disegnino sarebbe molto più facile spiegare...
    Comunque sono cambiate proprio solo 2 cose.
    
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    struct nodo{
        char info[20];
        struct nodo*next;
    
    };
    
    void stampa(struct nodo*);//gli passo inizio;
    void inserisci(struct nodo*,char[20]);  // inizio lista e la stringa;
    struct nodo *creanodo();
    
    main()
    {
       int scelta;
       
        struct nodo *inizio = NULL;// compilatore esigente
        char string[20];
        inizio=creanodo();
        strcpy(inizio -> info,  "Primo nodo");// evito spazzatura
        inizio -> next = NULL;   // tappo la lista evito di fare booommmbbbbeee
        for(scelta=0;scelta<3;scelta++)
        {
        printf("inserisci la stringa\n");
        scanf("%s",string);
        inserisci(inizio,string);
        
           
        }
        printf("\tStampa della lista\n");
        stampa(inizio);
    }
    
    void stampa(struct nodo *inizio){   //questa l'ho scritta un attimo io per vedere se andava o no
    	if(inizio == NULL) printf("Lista vuota\n");
    	else while(inizio != NULL){
    		printf("%s\n", inizio->info);
    		inizio = inizio->next;
    	}
    }
    
    struct nodo  * creanodo()
    {
        struct nodo *app;
           
       
       
        app=(struct nodo*)malloc(sizeof(struct nodo));
        app->next=NULL;
       
        return app;
    
    }
    
    
    
    void inserisci(struct nodo *inizio,char string[])
    {
        struct nodo *app;
        app=creanodo();// do memoria a app;
        strcpy(app->info,string);
        while(inizio->next != NULL)   //crei sempre un nodo in partenza quindi possiamo guardare nel campo next sicuri del fatto che il puntatore punti ad un nodo
        {
            inizio=inizio->next;  
        }
        inizio->next = app;  //app ora va attaccata ad inizio->next
      
    }
    
    Quando non ti funziona qualcosa però ragiona su quello che stai facendo perchè in questi casi spesso è solo un problema di puntatori gestiti un attimo male. Piuttosto fatti un disegnino di quello che fanno le istruzione e sicuramente ci arrivi anche da solo a quello che non va.
  • Re: Creazione nodo

    Grazie! seguirò il tuo consiglio !!
  • Re: Creazione nodo

    Però mi stampa sempre gli ultimi due elementi anche se ne inserisco 10
  • Re: Creazione nodo

    Ho risolto grazie!
Devi accedere o registrarti per scrivere nel forum
10 risposte