Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    8

    [c++] Lista: inserimento in coda

    Salve a tutti, ho un problema con l'inserimento di un nuovo nodo in coda ad una lista.
    Una volta lanciato, appena inserisco il valore, il programma non risponde più, ed esce il classico messaggio "l'applicazione ha smesso di funzionare".

    Ho isolato la funzione dal programma principale, ad un nuovo codice, ma la storia è la stessa.

    Spero possiate darmi una mano voi. Questo è il codice:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    
    struct nodo {                   /* dichiarazione struttura nodo */
           int dato;                // campo dell'informazione 
           struct nodo *next;       // campo dell'indirizzo del nodo successivo
           };
    
    
    nodo *head;                     // dichiarazione del nodo di testa
    int n;                          // dato da inserire
    nodo *nuovo;                    // nuovo nodo
    nodo *p;                        // puntatore indice
    
    
    int main()
    {
             head = NULL;                        // creazione della lista
             printf ("\n Nuovo inserimento: ");
             scanf ("%d", &n);                   // leggi numero da inserire
             
             nuovo = (nodo*)malloc(sizeof(struct nodo)); //alloca nuovo nodo
               
             nuovo->dato = n;                    // inserisci N in nodo.dato
             nuovo->next = NULL;                 // NUOVO punta a NULL.
             p=head;                             // P punta al nodo di testa
               
             while (p != NULL)                   // finché la lista non è finita
             { p = p->next; }                    // P punta la nodo successivo
              
             p->next = nuovo;                     // l'ultimo nodo punta a NUOVO
             system("pause");
             return 0;                
    }
    Grazie a tutti in anticipo.

  2. #2
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    codice:
    head = NULL;// creazione della lista
             printf ("\n Nuovo inserimento: ");
             scanf ("%d",&n);// leggi numero da inserire
             
             nuovo =(nodo*)malloc(sizeof(struct nodo));//alloca nuovo nodo
               
             nuovo->dato = n;// inserisci N in nodo.dato
             nuovo->next= NULL;// NUOVO punta a NULL.
             p=head;// P punta al nodo di testa
               
             while(p != NULL)// finché la lista non è finita
             { p = p->next;}// P punta la nodo successivo
              
             p->next= nuovo;// l'ultimo nodo punta a NUOVO
             system("pause");
             return0;      
    
    
    
    
    
    
    
    p=head; head è NULL , p = head= NULL



    p->next= nuovo; QUI stai facendo questa operazione su NULL ERRORE

    comunque è sbagliata , in ogni caso , dopo il while p , ANCHE contenendo una lista ,
    sarebbe NULL
    quindi dovrebbe essere ,
    while(p ->next!= NULL)

    P.S. Non si può creare una lista , con un solo nodo , sarebbe solo una struttura , occorrono almeno 2 nodi


    Ultima modifica di torn24; 06-01-2014 a 09:41
    Tecnologia

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    8
    Grazie, hai pienamente ragione: il ciclo while deve iterare finché p punta a NULL, perciò il giusto controllo è (p->next != NULL).
    Nel frattempo ho continuato a sbatterci la testa e ho provato ad allocare head con la malloc. Non va più in crash!
    Era anche quello un errore?

    codice:
    int main()
    {
             head = (nodo*)malloc(sizeof(struct nodo)); //alloca nuovo nodo
             head->next = NULL;      // creazione della lista
             printf ("\n Nuovo inserimento: ");
             scanf ("%d", &n);      // leggi numero da inserire
    
    
             nuovo = (nodo*)malloc(sizeof(struct nodo)); //alloca nuovo nodo
    
    
             nuovo->dato = n;   // inserisci N in nodo.dato
                                        
             nuovo->next = NULL;    // NUOVO punta a NULL.
             printf("\n Allocato nuovo nodo all'indirizzo %d\n ", nuovo);
             head->next=nuovo;
    
    
             p=head;           // P coincide col nodo di testa
             while (p->next != NULL)   // finché la lista non è finita
             { p = p->next; }    // P punta la nodo successivo
    
    
             p->next = nuovo;    // l'ultimo nodo punta a NUOVO
             
             system("pause");
             return 0;
    }

    però ho lasciato "p=head", e non ha dato problemi. Come mai?

  4. #4
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551
    Avevo già provato a spiegartelo head era NULL , quindi prima p=head equivaleva a p=NULL
    Ora allocando memoria con malloc , head ora contiene un indirizzo alla memoria allocata , allora p=head , sia p che head contengono lo stesso indirizzo .

    prima facevi p->next con p=NULL
    ora fai p->next , dove next ESISTE
    Tecnologia

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    8
    chiaro
    però ancora non funziona.. il problema è che una volta arrivati alla fine della lista, essendo p un puntatore d'appoggio in cui copio il nodo che sto leggendo, non mi fa leggere l'indirizzo dell'ultimo nodo! dovrei tornare indietro di un nodo per collegare l'ultimo al nuovo. per farlo potrei utilizzare un secondo puntatore d'appoggio per memorizzare di volta in volta l'indirizzo del nodo precedente, oppure potrei leggere ogni volta due nodi avanti (p->next->next). in questo modo mi accorgo in tempo di essere arrivato alla fine della lista.
    spero di riuscire a risolvere, è un pò che sbatto la testa sulle liste e dovrei andare avanti xD
    ti ringrazio per i consigli

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    8
    RISOLTO!
    oltre il problema di cui ho appena parlato, rileggendo la tua frase..

    prima facevi p->next con p=NULL
    ora fai p->next , dove next ESISTE
    ..ho capito che l'errore fondamentale era che p lo utilizzo sì come puntaore, ma ho bisogno che sia un nodo, non solo un puntatore, in quanto gestisco i campi p->next e p->dato, che in un semplice putatore non esistono. che io sappia un puntatore di tipo nodo *p è semplicemente una cella di memoria che può contenere l'indirizzo di un nodo, e non presenta campi!
    infatti ovunque appena nominavo p->next o p->dato (che non esistevano) andava in crash tutto (a 'sto punto strano però che non mi abbia dato l'errore!).
    Ho risolto semplicemente allocando p come nodo con la malloc, come ho fatto per nuovo.
    il codice dell'intera procedura è il seguente, e finalmente, funziona a meraviglia!!!

    codice:
    void inscoda() // operazione di inserimento in coda
    {
         int n;    // dato da inserire
         nodo *nuovo;  // nuovo nodo
         nodo *p;   // puntatore d'appoggio
         nuovo = (nodo*)malloc(sizeof(struct nodo)); // alloca nuovo nodo
         p = (nodo*)malloc(sizeof(struct nodo)); // alloca il nodo d'appoggio
    
         printf ("\n Nuovo inserimento: ");
         scanf ("%d", &n); // legge dato da inserire
         
         nuovo->dato=n; // nel campo del dato inserisci n
         nuovo->next=NULL; // il nodo punta a NULL
         
         if(head==NULL)// se la lista è vuota 
         head = nuovo;// collega nuovo direttamente a head
    
         else
         {
           for ( p = head; p->next != NULL; p = p->next ); // scorri la lista finché p non punta all'ultimo nodo
           p->next = nuovo; //assegnazione dell'indirizzo del nuovo nodo al puntatore  
         }   
         return;
    }
    ti ringrazio ancora, credo di aver finalmente risolto... a risentirci!

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.