Lista a puntatori non funziona

di il
29 risposte

29 Risposte - Pagina 2

  • Re: Lista a puntatori non funziona

    Inserimento in testa:
    
    nodo->succ = NULL;
    nudo->prec = NULL;
    
    inserimento in fondo:
    
    for(ptr = testa; ptr != NULL; ptr = ptr->next);
    nodo->succ = NULL;
    nodo->prec = ptr;
    
  • Re: Lista a puntatori non funziona

    Uhm..guarda, nel frattempo che tu mi rispondevi, io ho provato ad impostarlo in questo modo..
     //dichiarazione struttura lista e variabili puntatore//
    struct nodo
    {
      int num;
      struct nodo* succ;
    };
    nodo* testa=NULL;
    nodo* nuovo;
    nodo* coda=NULL;
    nodo* succ;
    nodo* prec; 
       //inserimento//           
             case 1:
                   {
                      if((testa==NULL)&&(coda=NULL))                             
                      {
                        nuovo=new nodo;  
                        cout<<"inserisci elemento"<<"\n";
                        cin>>nuovo->num;
                        nuovo->succ=testa;
                        testa=nuovo;
                        coda=nuovo;
                      }  
                      else
                      {
                        prec=succ;  
                        succ=new nodo;
                        cout<<"inserisci elemento"<<"\n";
                        cin>>succ->num;
                        succ->succ=NULL;
                        coda=succ;
                      }
                      break;
                   }     
     
             //estrazione//
             case 2:
                   {
                     if(testa=NULL)
                     cout<<"pila vuota"<<"\n";
                     else
                     {
                         cout<<"l'elemento estratto e':"<<"\n";
                         cout<<coda->num<<"\n";   
                         coda=prec;
                       }  
                     break;
                   }
     
    Risultato: se inserisco 3 elementi (es.3-4-5), mi estrae il primo e poi sempre il secondo (es. prima il 5 e poi sempre il 4..)..sento di essere vicino alla soluzione..
  • Re: Lista a puntatori non funziona

    
    #include <iostream>
    
    using namespace std;
    
    typedef struct  nodo
    {
    	int valore;
    	nodo *succ;
    	nodo *prec;
    }nodo;
    
    void inserisciValore(nodo *&testa,nodo *&coda,int valore);
    void stampa_lista(nodo *&testa, nodo *&coda);
    void svuota_lista(nodo *&coda);
    
    int main()
    {
    	nodo *testa = NULL;
    	nodo *coda = NULL;
    	int i = 0;
    	for(i = 0; i < 10; i++)
    		inserisciValore(testa,coda,i);
    	stampa_lista(testa,coda);
    	svuota_lista(coda);
    	return 0;
    }
    
    void inserisciValore(nodo *&testa,nodo *&coda,int valore)
    {
    	nodo *nuovo = new nodo;
    	nuovo->valore = valore;
    	if(testa == NULL)
    	{
    		nuovo->succ = NULL;
    		nuovo->prec = NULL;
    		testa = nuovo;
    		coda = testa;
    	}
    	else
    	{
    		nuovo->succ = NULL;
    		coda->succ = nuovo;
    		nuovo->prec = coda;
    		coda = nuovo;
    	}
    }
    
    void stampa_lista(nodo *&testa, nodo *&coda)
    {
    	nodo *ptr = NULL;
    	cout << "stampa in succ" << endl;
    	for(ptr = testa; ptr != NULL; ptr = ptr->succ)
    		cout <<ptr->valore << " ";
    
    	cout << endl;
    
    	cout << "stampa in prec" << endl;
    	for(ptr = coda; ptr != NULL; ptr = ptr->prec)
    		cout <<ptr->valore << " ";
    }
    
    void svuota_lista(nodo *&coda)
    {
           if(!coda) return;
    	nodo *ptr = coda;
    	nodo *ptr2 = NULL;
    	do 
    	{
    		ptr2 = ptr->prec;
    		delete ptr;
    		ptr = ptr2;
    	} while (ptr != NULL);
    }
    
  • Re: Lista a puntatori non funziona

    Uhm..ho alcune osservazioni da farti..

    ..io l'estrazione devo farla un elemento alla volta, per questo sto gestendo un menù di scelta multipla..

    ..per cui il do while non mi serve..e poi io devo visualizzare in output quale elemento sto estraendo..io ho messo "cout<<ptr->num;", ma non so se è l'istruzione giusta..

    ..scusa se ti scoccio continuamente, ma cerchiamo di risolvere questo problema, please...
  • Re: Lista a puntatori non funziona

    Tieni un puntatore che va sempre a scalare no? prima punta a coda poi a coda->prec e così via.
  • Re: Lista a puntatori non funziona

    Ok, e questi sono ptr e ptr2..ci siamo..

    ..però in questo codice..
            //estrazione//
             case 2:
                   { 
                     nodo *ptr = coda;
                     nodo *ptr2 = NULL;            
                     if(testa=NULL)
                     cout<<"pila vuota"<<"\n";
                     else
                     {
                           cout<<"l'elemento estratto e':";
                           cout<<ptr->num;
                           ptr2=ptr->prec;
                           delete ptr;
                           ptr=ptr2;
                     }  
                     break;
                   }
     
    ..ho tolto il do while, ho messo "cout<<ptr->num" per visualizzare ogni volta l'elemento estratto, sembra non esserci nulla di sbagliato..eppure se inserisco i soliti numeri 4-5-6 mi estrae per primo il 6, poi mi estrae 4132768..!
  • Re: Lista a puntatori non funziona

    Devi aggiornare anche coda, lo devi far puntare al ptr2 una volta eliminato ptr;
  • Re: Lista a puntatori non funziona

    Coda=ptr2;

    ..EUREKA!!!

    ..adesso funziona..

    ..però devo chiederti un'ultimissima cosa, giuro..

    ..nella carica che mi hai scritto stanotte tu, mi descrivi le varie fasi della parte dell'else, ovvero quella di un inserimento successivo al primo? ..perchè sinceramente non ho capito cosa e perchè hai fatto quello..!
  • Re: Lista a puntatori non funziona

    
    else
       {
          nuovo->succ = NULL; //il successivo del nodo nuovo è NULL
          coda->succ = nuovo;  //coda->succ prima puntava a NULL adesso lo facciamo puntare al nodo nuovo
          nuovo->prec = coda; //il prec del nodo nuovo puntava a NULL adesso lo facciamo puntare a coda
          coda = nuovo; //coda punta al elemento precedente al nuovo che adesso diventà coda. quindi coda = nuovo aggiorna lo stato della coda.
       }
    
  • Re: Lista a puntatori non funziona

    Ti ringrazio..però, secondo il mio ragionamento, quando noi creiamo un nuovo nodo, ad esempio al secondo o al terzo inserimento, il nodo che andiamo a creare non dovrebbe essere puntato da succ del nodo precedente anzichè da nuovo?
  • Re: Lista a puntatori non funziona

    Coda->succ = nuovo; //coda->succ prima puntava a NULL adesso lo facciamo puntare al nodo nuovo
    coda è il nodo precedente. alla fine coda sarà il nodo che abbiamo insrito x ultimo e lo facciamo quì:
    coda = nuovo;
  • Re: Lista a puntatori non funziona

    Grazie mille....ho corretto come di seguito ma continua a non stampare a video la lista!!!!non vedo l'ora di imparare le funzioni di cui mi parlavi così posso evitare queste maledette liste
    #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;
            nuovo->succ=NULL;
            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

    
    	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)
    			for(ptr=lista;ptr !=NULL;ptr=ptr->succ)
    
    
    				cout<<ptr->num<<endl;
    		}
    		cout<<endl;
    
    		return 0;
    
    	}
    
    guarda il cambiamento.magari era una svista.
  • Re: Lista a puntatori non funziona

    Grazie grazie grazie grazie
    funzionaaaaaaaaa!!!

    Grazie ancora...farò tesoro dei tuoi insegnamenti (ammesso che ci riesca
  • Re: Lista a puntatori non funziona

    Ok, adesso ho capito tutto..ti ringrazio immensamente ancora una volta..
Devi accedere o registrarti per scrivere nel forum
29 risposte