Lista a puntatori non funziona

di il
29 risposte

Lista a puntatori non funziona

Ciao a tutti,
ringrazio in anticipo per la pazienza ma da ieri che ci sbatto la testa
per cercare di capire un pò meglio i puntatori volevo creare una semplicissima lista di interi e stamparla a video...non mi riesce di capire dove sbaglio...evidentemente non linko alla testa della lista il secondo elemento ma davvero non capisco cosa ho sbagliato...qualcuno mi può aiutare??
Grazie mille

#include <iostream> 
using namespace std; 
using std::cout; 
using std::cin; 
using std::endl; 

struct cella { 
int dato; 
cella*next; 
}; 

int inserisciDato (cella* &, int); 

int stampaLista (cella*); 

int main() 
{ 
int pausa; 
int num; 
char scelta; 
cella*testa; 
testa=NULL; 

stampaLista (testa); 


do 
{ 
cout<<"inserisci i per inserire u per uscire"<<endl; 
cin>>scelta; 
if(scelta=='i') 
{cout<<"la lista ora e' :"<<endl; 
stampaLista(testa); 
cout<<"inserisci il dato: "<<endl; 
cin>>num; 

inserisciDato(testa,num); 

cout<<"lista aggiornata: "<<endl; 
stampaLista(testa); 
} 

else if(scelta!='u') 
cout<<"scelta non valida"<<endl; 

}while (scelta!='u'); 

cout<<"pausa"<<endl; 
cin>>pausa; 

return 0; 
} 

//funzione per inserire elementi in lista 

int inserisciDato(cella* &punt,int val) 

{ 
cella*ptr; 

if(punt==NULL) 
{ punt=new cella; 
punt->dato=val; 
ptr=punt->next; 



} 

else 

{ 
ptr=new cella; 
ptr->dato=val; 
ptr=ptr->next; 

} 


return 0; 
} 

int stampaLista(cella*lista) 

{ 


cella*ptr; 

if (lista==NULL) 
{ 
cout<<"lista vuota"<<endl; 
} 

else 
{ for(ptr=lista;ptr!=NULL;ptr=ptr->next) 
cout<<ptr->dato<<endl; 

} 
cout<<endl; 

return 0; 
}

29 Risposte

  • Re: Lista a puntatori non funziona

    
    cella * inserisciDato(cella* &punt,int val)
    
    {
    cella*ptr = NULL;
    
    if(punt==NULL)
    { punt=new cella;
    punt->dato=val;
    punt->next = NULL;
    return punt;
    
    
    }
    
    else
    
    {
    //inserimento in testa, gli elementi vengono spinti una struttuta a pila
    ptr=new cella;
    ptr->dato=val;
    ptr->next = punt;
    return ptr;
    }
    
    
    return punt;
    } 
    
    
    //nel main chiami la funzione così:
    testa = inserisciDato(testa,num); 
    
    carta e penna e ci arrivi.
  • Re: Lista a puntatori non funziona

    Grazie mille, ora finalmente c'è una lista ma nelle mie intenzioni la testa doveva rimanere un puntatore all'inizio della lista in modo tale che passandolo alla funzione stampa la lista venisse stampata nell'ordine di inserimento. Un chiarimento: ho visto che hai modificato la funzione inserisciDato facendomi restituire il puntatore.Ma se io la "testa della lista " la passo per indirizzo la funzione non dovrebbe direttamente modificare la testa in modo che punti al primo elemento creato nel caso fosse precedentemente nulla?
    Grazie ancora per la tua gentile disponibilità
  • Re: Lista a puntatori non funziona

    Allora devi inserire sempre in fondo. scorri con un puntatore che parte dalla testa e verifica se next è diverso da NULL. se si fai puntare questo next alla cella appena creata con new e al next di questa cella li assegni NULL. così la testa non viene mai modificata. Poi una domanda: siccome sei in C++ e non in C non basterebbe usare la std::list oppure std::queue invece di sbizzarirsi con container custom?
  • Re: Lista a puntatori non funziona

    Ok, penso si imponga una premessa...
    mi sto preparando per l'esame di fondamenti di informatica...non pensare ora di trovarti di fronte una ragazzina...ho quarant'anni suonati e questo è il mio tentativo di mettere in cantiere la mia seconda laurea...giusto per non sentirmi troppo vecchia!!!
    Mi sono iscritta ad ingegneria informatica perchè ho bisogno per il mio lavoro di ricerca in campo medico di una preparazione in fisica ed analisi di cui allo stato attuale non dispongo ed ingegneria informatica è l'unica che al politecnico si possa seguire online...con due figli e un lavoro a tempo pieno( dalle 8 alle 12 ore al giorno ) non posso anche andare a lezione!!
    tutto ciò per dire che non ho nessuna preparazione pregressa in campo informatico, ciò che so l'ho imparato al corso, non conosco la std::list e la std:queue e devo imparare a costruire queste semplici liste che sono sicuramente banalissime per te ma non lo sono altrettanto per me!
    e siccome ogni volta che uso i puntatori mi incasino per un motivo o per l'altro vorrei cercare di mettere dei punti fermi!

    Scusa la lunga premessa...
    Comunque ho provato a riscrivere il codice (che ovviamente ancora non funziona dopo tutta la spremitura della mia ormai decadente materia grigia per cercare di fare quanto mi hai spiegato...cosa ho combinato adesso???
    #include<iostream>
    
    using namespace std;
    using std::cout;
    using std::cin;
    using std::endl;
    
    struct nodo{
           int num;
           nodo*succ;
           };
    
    
    nodo* inserisciElemento (nodo* &,int);
    int stampaLista(nodo*);
    
    int main()
    
    {int value;
     int pausa;
     char op;
     nodo*testa=NULL;
     nodo*temp=NULL;
     
     do
     
       {
                    cout<<"i per inserire, u per uscire: "<<endl;
                    cin>>op;
                    cout<<"la lista attuale è la seguente: "<<endl;
                    
                    stampaLista(testa);
                    
                    if (op=='i')
                    
                    { 
                      cout<<"inserisci il numero: "<<endl;
                      cin>>value;
                      testa=inserisciElemento(testa,value);
                      
                      cout<<"lista aggiornata: "<<endl;
                      stampaLista(testa);
                      }
                      
                    else if (op!='u')
                    cout<<"operazione non valida"<<endl;
                    
      } while (op != 'u');
      
      return 0;
      
    }
    
    
    
    nodo* inserisciElemento (nodo* &lista, int nr)
    
    {
    
        nodo*nuovo;
        nuovo=new nodo;
        nuovo->num=nr;
        nodo*p;           //puntatore di servizio
        
        p=lista;
        
        if(p!=NULL)      //la lista non è vuota
        
        
        {
                         while(p->succ)
                         {
                                       p=p->succ;       //scorro la lista cercando l'ultimo elemento
                          }
                        p->succ=nuovo;
                        
        }
        
        else            //la lista è vuota
        
        lista= nuovo;
        
        return lista;
        
    }
    
    
    int stampaLista(nodo*lista)
    
    {
        nodo*ptr;
        ptr=lista;
        
         if (lista==NULL)
            {
               cout<<"lista vuota"<<endl;
               }
               
        else
        {
            for(ptr=lista;ptr->succ=NULL;ptr=ptr->succ)
        
       
                       cout<<ptr->num<<endl;
         }
         cout<<endl;
         cout<<"pausa"<<endl;
    cin>>pausa;//altrimenti dev c++ non mi fa vedere l'anteprima ed è il compilatore dell'esame
        return 0;
        
    }
    
     
     
    

    Grazie mille per la tua pazienza e il tuo prezioso aiuto
  • Re: Lista a puntatori non funziona

    Non pregiudico le persone quindi non sapevo quanti anni tu potessi avere, cerco solo di aiutare in quel che so e mi sembra un paradosso che all'università studino ancora coi metodi di 20 anni fà.Non comprendo il fatto che ti dicono che ti stano studiando il C++ e ti impongono a fare esercizi in C. Il C++ non è C con le classi aggiunte ma una cosa totalmente diversa, per quello che ti dico che senso ha insegnarti le liste lincate come se fosse il C quando il C++ ha già i contenitori pronti, ma lasciamo perdere perche è come arrabbiarsi contro un muro di gomma. La colpa non è tua ma di chi ti insegna. Tornando a noi. Un errore che fanno tutti principianti e non, è quello di NON inizializzare mai le variabili. Vedi le tue varaibili: ogni volta che li dichiari non sono inizializzate. Questo cosa comporta: al primo uso la variabile conterrà un valore random e non è assicurato che sia azzerrato. Vedi le tue dichiarazioni:
    
    nodo*nuovo;
    nodo *p;
    
    Il modo giusto sarebbe stato quello di inizializzarli e ci va poco
    
    nodo*nuovo = NULL;
    nodo *p = NULL;
    
    così si è sicuri che queste variabili puntano a nulla.
    
    p=lista; //punta al primo elemento ed è OK.
    if(p!=NULL)      //la lista non è vuota ed è OK
    {
               while(p->succ)
               {
                   p=p->succ;       //scorro la lista cercando l'ultimo elemento
                }
                p->succ=nuovo;
    }
    else
    {           //la lista è vuota OK
       
        lista= nuovo; //quì c'è il primo problema
    // siccome nuovo è stato allocato con new il campo nuovo->succ non contiene NULL perche tu non //l'hai inzializzato come tale. quindi il modo giusto sarebbe stato
    nuovo=new nodo;
    nuovo->num=nr;
    nuovo->succ = NULL; //questo assicura che il ciclo while non vagi per eternità alla ricerca di un NULL.
    }
    
    con queste correzioni il tuo codice è corretto.
  • Re: Lista a puntatori non funziona

    Vedo che si parla di liste e siccome ho anch'io un problema con le liste ho pensato di intrufolarmi (spero mi scuserai Monnalisa.. )..

    Allora questa volta il mio algoritmo si deve poter inserire ed estrarre elementi in coda ad una lista..

    ..bene, l'inserimento credo di aver capito come farlo.. ...ma per quanto riguarda l'estrazione non so come fare..riesco ad estrarre solo un numero della lista, ma se ne volessi poi estrarre un altro non so come fare, non riesco ad aggiornare il puntatore alla fine della lista..guardate:
              //estrazione//
             case 2:
                   {
                     if(testa=NULL)
                     cout<<"lista vuota"<<"\n";
                     else
                     {
                       cout<<succ->num<<"\n";
                       coda=coda->succ;             
                     }
                     break;
                   }
     
    testa=puntatore alla testa della lista
    coda=puntatore alla fine della lista
  • Re: Lista a puntatori non funziona

    @Gianlu93
    devi tenere anche un puntatore all'elemento precedente, oppure creare la tua lista come bi-lincata e inserire anche il puntatore prec pre scorrere gli elemeti a ritroso.

    p.s.:: Bisogna fare una petizione ai insegnanti per proibire l'uso di Dev C++ nelle loro lezioni in quanto è vecchio e deprecato.
  • Re: Lista a puntatori non funziona

    Si, ci avevo pensato anch'io a creare un puntatore per l'elemento precedente..però non so come fare per aggiornarlo sia quando avviene la carica, sia dopo che è avvenuta la prima estrazione..

    ..è da giorni che ci ragiono e non ne vengo a capo!!
  • Re: Lista a puntatori non funziona

    Grazie delle risposte...
    Non pregiudico le persone quindi non sapevo quanti anni tu potessi avere, cerco solo di aiutare in quel che so e mi sembra un paradosso che all'università studino ancora coi metodi di 20 anni fà.
    Tranquillo ...non c'era polemica nelle mie parole, solo il tentativo di farti capire la mia situazione
    mi sembra un paradosso che all'università studino ancora coi metodi di 20 anni fà
    ..forse perchè pensano di dovermi insegnare le cose che si insegnavano quando ho iniziato la prima università
    Non lo capisco neanche io ma c'è poco da far polemica..se consideri che all'esame ci troveremo dev c++ come compilatore mentre per fare le esercitazioni online loro stessi ne usano un altro...
    grazie delle correzioni...mi ricorderò di mettere a NULL ogni puntatore nuovo...e dire che lo sapevo anche
    Grazie ancora, sei stato molto gentile

    P.S.
    con queste correzioni il tuo codice è corretto.
    YEEEES!

    P.S del P.s per amor di verità ci sarà anche visual studio come compilatore ma non sono riuscita a farlo funzionare!!Con codeblocks mi trovo bene, ma quello non ci sarà per cui mi sto costringendo ad usare l'unico che ho e che ci sarà all'esame
    Per Gianlu..non mi offendo ma non ti posso aiutare!
  • Re: Lista a puntatori non funziona

    Scusa se rompo ancora l'ho corretto come di seguito ma non stampa la lista...capperi ma possibile che sia così rimba???
    #include<iostream>
    
        using namespace std;
        using std::cout;
        using std::cin;
        using std::endl;
    
        struct nodo{
               int num;
               nodo*succ;
               };
    
    
        nodo* inserisciElemento (nodo* &,int);
        int stampaLista(nodo*);
    
        int main()
    
        {int value;
        int pausa;
        char op;
        nodo*testa=NULL;
        nodo*temp=NULL;
    
        do
    
           {
                        cout<<"i per inserire, u per uscire: "<<endl;
                        cin>>op;
                        cout<<"la lista attuale è la seguente: "<<endl;
                       
                        stampaLista(testa);
                       
                        if (op=='i')
                       
                        {
                          cout<<"inserisci il numero: "<<endl;
                          cin>>value;
                          testa=inserisciElemento(testa,value);
                         
                          cout<<"lista aggiornata: "<<endl;
                          stampaLista(testa);
                          }
                         
                        else if (op!='u')
                        cout<<"operazione non valida"<<endl;
                       
          } while (op != 'u');
          
          cout<<"pausa"<<endl;
          cin>>pausa;//altrimenti dev c++ non mi fa vedere l'anteprima ed è il compilatore dell'esame
         
          return 0;
         
        }
    
    
    
        nodo* inserisciElemento (nodo* &lista, int nr)
    
        {
    
            nodo*nuovo=NULL;
            nuovo=new nodo;
            nuovo->num=nr;
            nodo*p=NULL;           //puntatore di servizio
           
            p=lista;
           
            if(p!=NULL)      //la lista non è vuota
           
           
            {
                             while(p->succ)
                             {
                                           p=p->succ;       //scorro la lista cercando l'ultimo elemento
                              }
                            p->succ=nuovo;
                           
            }
           
            else            //la lista è vuota
           
            lista= nuovo;
           
            return lista;
           
        }
    
    
        int stampaLista(nodo*lista)
    
        {
            nodo*ptr=NULL;
            ptr=lista;
           
             if (lista==NULL)
                {
                   cout<<"lista vuota"<<endl;
                   }
                   
            else
            {
                for(ptr=lista;ptr->succ=NULL;ptr=ptr->succ)
           
           
                           cout<<ptr->num<<endl;
             }
             cout<<endl;
             
            return 0;
           
        }
  • Re: Lista a puntatori non funziona

    Hai capito ma non hai applicato
    
    nodo*nuovo=NULL;
    nuovo=new nodo;
    nuovo->num=nr;
    
    
    nodo*nuovo=NULL;
    nuovo=new nodo;
    nuovo->num=nr;
    nuovo->succ = NULL;
    
  • Re: Lista a puntatori non funziona

    ..Il tuo ultimo post è riferito a Monnalisa, vero skynet?
  • Re: Lista a puntatori non funziona

    Che facciamo due piccioni con una fava? Si. Per te una soluzione indolore sarebbe quella di fare un ciclo for x ogni elemto da estrarre anche se non è una soluzione adeguata senza la bi-lincata.
    
    while(coda != testa)  // il ciclo continua finche coda non arriva alla testa
    {
       for(ptr = testa; ptr->next != coda; ptr = ptr->next); //vai fino all'elemento che precede coda.
       cout << coda->valore;  // stampa coda
       coda = ptr; //decrementi coda e lo fai puntare all'elemento precedente
    }
    
    il codice non è provato, è solo una supposizione quindi prendilo con le pinze.
  • Re: Lista a puntatori non funziona

    Uhm..no, non ci siamo ancora purtroppo..

    ..invece per farla bi-lincata, ovvero con ogni nodo che dovrebbe avere un puntatore al nodo successivo e uno al nodo precedente, come potrei fare?

    ..per la carica, soprattutto..
Devi accedere o registrarti per scrivere nel forum
29 risposte