Visualizzazione dei risultati da 1 a 9 su 9

Discussione: concetto pila[c++]

  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    153

    concetto pila[c++]

    ciao a tutti quaòcuno mi saprebbe dire gentilmente cosa fa in modo grafico questo frammento di codice in c ++??
    codice:
    void PushDown(string d)
       {
          Nodo *appo = new Nodo;
          appo->nome = d;
          appo->next = NULL;
          if(fondo!=NULL)
          {
             fondo->next=appo;
             fondo=appo;
          }
          else
          {
             testa=appo;      
             fondo=appo;
          }     
       }  
       bool PopDown()
       {
          if(testa!=NULL)
          {
             if(testa->next!=NULL)
             {
                Nodo *appo = new Nodo;  
                Nodo *appo1 = new Nodo;  
                appo=testa;
                appo1=appo->next;
                while(appo1->next!=NULL)
                {  
                   appo=appo1;
                   appo1=appo1->next;
                }
                delete appo1;
                appo->next=NULL;
                fondo=appo;
             }   
             else
             {
                delete testa;
                testa=NULL;
                fondo=NULL;
             }   
             return(true);
          }   
          else
             return(false);
       }
    grazie a tutti


  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    153
    scusate ma l'inserimento in fondo sarebbe il concetto di una coda ho sbagliato a scrivere scusate.

  3. #3

    Re: concetto pila[c++]

    Originariamente inviato da trek
    ciao a tutti quaòcuno mi saprebbe dire gentilmente cosa fa in modo grafico questo frammento di codice in c ++??
    Cosa intendi per modo grafico?

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    153
    cosa dovrei disegnarlo se volessi farlo capire in modo semplice cioe cosa fa all'interno della memoria.. e poi saresti cosi gentile a dirmi cosa fa questa istruzione?

    es:
    appo->nome=d;
    appo->nest=NULL;
    appo->next=testa;

    grazie mille!

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Beh ... ma mica ci si puo' mettere a "disegnare" per rispondere ai quesiti .... !
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Codice PHP:
    // inserisco un nuovo nodo alla pila
    void PushDown(string d)
       {
    // creo il nuovo nodo
          
    Nodo *appo = new Nodo;
    // imposto il suo membro nome al valore passato alla funzione
          
    appo->nome d;
    // questo è il nuovo nodo, non ha nessun altro dietro
          
    appo->next NULL;
          if(
    fondo!=NULL)
          {
    // ok, esiste un nodo in fondo alla pila
    // diventa il genitore
             
    fondo->next=appo;
    // e il nuovo nodo diventa l'ultimo nella pila
             
    fondo=appo;
          }
          else
          {
    // non c'è ancora niente
    // allora il mio nuovo nodo diventa
    // testa e coda
             
    testa=appo;      
             
    fondo=appo;
          }     
       }  

    // ciao 

  7. #7
    PoPDown invece elimina l'ultimo nodo (fondo) e ritorna un booleano nel caso abbia eliminato qualcosa o meno.

    Se la lista è vuota torna false

    se non è vuota controlla se sia composta da un nodo solo o più nodi

    se è composta da un solo nodo (la testa e il fondo sono uguali) lo elimina imposta a null sia la testa che il fondo e ritorna true

    se invece è composta da più di un nodo scorre la lista alla ricerca del fondo, lo elimina e ritorna true. Lo cerca invece di fare riferimento direttamente al puntatore fondo perchè eliminandolo direttamente il nodo precedente avrebbe un puntatore vuoto di memoria non impostato a NULL.

    codice:
    bool PopDown()
       {
          if(testa!=NULL) //Se la testa non è null, ovvero se la lista è composta da ALMENO 1 nodo
          {
             if(testa->next!=NULL) //Se la lista è composta da più di 1 nodo
             { //Cerco il fondo
                Nodo *appo = new Nodo;  
                Nodo *appo1 = new Nodo;  
                appo=testa; //Tengo memoria del nodo attuale
                appo1=appo->next; //Tengo memoria del nodo successivo a quello attuale
                while(appo1->next!=NULL) //Finchè il nodo successivo del nodo successivo non è null, ovvero finchè il nodo successivo non è il fondo...
                {  
                   appo=appo1; //sposto il mio nodo attuale a quello successivo
                   appo1=appo1->next; //e quello successivo al successivo dell'attuale
                }
                delete appo1; //Terminato il while SO che appo1 è il fondo quindi libero la memoria.
                appo->next=NULL; //In appo ho il nodo precedente al fondo, quello che lo puntava con il suo Next, aggiusto il puntatore impostandoilo a NULL. Questa riga di codice è quella che ha obbligato l'intero procedimento a fare utilizzo del ciclo while invece di agire direttamente sul puntatore fondo!
                fondo=appo; Imposto il puntatore fondo a questo nodo, che è diventato ora lui il fondo
             }   
             else //se la lista è composta da 1 solo nodo ho testa e fondo uguali, elimino quindi l'unico nodo.
             {
                delete testa;
                testa=NULL;
                fondo=NULL;
             }   
             return(true); //ho eliminato qualcosa quindi torno true
          }   
          else //non ho nodi nella lista, ritorno false
             return(false);
       }

    PS. Inserimento in fondo ed eliminazione in fondo, anche detto FIFO (First In First Out) è il concetto della PILA non della Coda... Un esempio pratico di sistema con questo criterio è lo "stack delle chiamate".

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    153
    grazie della tua risposta esauriente.. se io volessi pero cancellare tutti gli elementi come posso fare?
    guarda metto tutto il codice così si capisce meglio.
    codice:
    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    struct Nodo
    {
       string nome;
       struct Nodo *next;
    };
    
    class PilaCoda
    {
                 
       Nodo *testa;
       Nodo *fondo;
      
       public:
    
       PilaCoda()
       {
          testa = NULL;
          fondo = NULL;
       }
       
       void PushUp(string d)
       {
          Nodo *appo = new Nodo;
          appo->nome = d;
          appo->next = NULL;
          if(testa!=NULL)
          {
             appo->next=testa;            
             testa=appo;
          }   
          else
          {
             testa=appo;
             fondo=appo;
          }
       }
    
       void PushDown(string d)
       {
          Nodo *appo = new Nodo;
          appo->nome = d;
          appo->next = NULL;
          if(fondo!=NULL)
          {
             fondo->next=appo;
             fondo=appo;
          }
          else
          {
             testa=appo;      
             fondo=appo;
          }    
       } 
    
       bool PopUp()
       {
          if(testa!=NULL)
          {
             Nodo *appo = new Nodo; 
             appo=testa;
             testa=testa->next;
             delete appo;           
             if(testa==NULL)
             {
                fondo=NULL;
             }               
             return(true);
          }   
          else
             return(false);
       }
       
       bool PopDown()
       {
          if(testa!=NULL)
          {
             if(testa->next!=NULL)
             {
                Nodo *appo = new Nodo;  
                Nodo *appo1 = new Nodo;  
                appo=testa;
                appo1=appo->next;
                while(appo1->next!=NULL)
                {  
                   appo=appo1;
                   appo1=appo1->next;
                }
                delete appo1;
                appo->next=NULL;
                fondo=appo;
             }   
             else
             {
                delete testa;
                testa=NULL;
                fondo=NULL;
             }   
             return(true);
          }   
          else
             return(false);
       }
       
       bool Visual()
       {              
          if(testa!=NULL)
          {
             Nodo *appo = new Nodo;  
             appo=testa;
             while(appo!=NULL)
             {  
                cout << appo->nome << endl; 
                appo=appo->next;
             }
             return(true);
          }
          else
             return(false);
       }        
    
    
       string Top()
       {
          if(testa!=NULL)
             return(testa->nome);
          else
             return("");   
       }                   
    
       string Bottom()
       {
          if(testa!=NULL)
             return(fondo->nome);
          else
             return("");   
       }                   
    };
    
    int main()
    {
       char scelta='z';
       char scelta2='z';
       string dato;
       string prov;
       bool risu;
       PilaCoda A;
       PilaCoda B;
       PilaCoda C;
    
       while(scelta!='f')
       {
          cout << endl;             
          cout << "PILACODA" << endl;
          cout << "f - fine" << endl;
          cout << "v - vedi coda A" << endl;
          cout << "w - vedi coda B" << endl;
          cout << "z - vedi coda C" << endl;
          cout << "b - inserisci nome coda B" << endl;
          cout << "c - inserisci nome coda C" << endl;
          cout << "h - estrai da coda A" << endl;
          cout << "e - estrai da coda B" << endl;
          cout << "g - estrai da coda C" << endl;
          cout << "scegli:";
          cin >> scelta;
          cout << endl;             
    
          switch(scelta)
          {
             case 'b': {
                cout << "inserisci nome: ";  
                cin >> dato;
                B.PushDown(dato);            
                cout << endl << "inserito nome in fondo" << endl;  
                break;}
                
             case 'c': {
                cout << "inserisci nome: ";  
                cin >> dato;  
                C.PushDown(dato);            
                cout << endl << "inserito nome in fondo" << endl;  
                break;}
                
             case 'h': {
                if(A.Top()!="") 
                {
                  string prov=A.Top();
                  while(scelta2!='i')
                  {
                    cout  << "COSA VUOI FARE?" << endl;  
                    cout  << "i - indietro" << endl;  
                    cout  << "b - inserisci in fondo a B" << endl;  
                    cout  << "c - inserisci in fondo a C" << endl;
                    cin >>scelta2; 
                    switch(scelta2)
                    {
                    case 'b':{
                         A.PopUp();
                         B.PushDown(prov);
                         cout << endl << "eliminato nome in cima" << endl;
                         break;}
                     
                    case 'c':{
                         A.PopUp();
                         C.PushDown(prov);
                         cout << endl << "eliminato nome in cima" << endl;
                         break;}
                         }                              
                  }    
                   scelta2='z';       
                }
                else
                   cout << "PilaCoda vuota";
                break;}
    
             case 'e': {
                string prov=B.Top();
                if(B.PopUp()) 
                {
                   A.PushDown(prov);
                   cout << endl << "eliminato nome in cima" << endl;  
                }
                else
                   cout << "PilaCoda vuota";
                break;}
                
             case 'g': {
                string prov=C.Top();
                if(C.PopUp()) 
                {
                   A.PushDown(prov);
                   cout << endl << "eliminato nome in cima" << endl;  
                }
                else
                   cout << "PilaCoda vuota";
                   
                break;}
                
             case 'd': {
                if(A.PopDown())    
                   cout << endl << "eliminato nome in fondo" << endl;  
                else
                   cout << "PilaCoda vuota";
                break;}
    
             case 'v': {
                if(A.Visual())    
                {
                   cout << endl;
                   cout << "cima  :" << A.Top() << endl;
                   cout << "fondo :" << A.Bottom() << endl;
                }                  
                else
                   cout << "PilaCoda vuota";
                break;}
                         
             case 'w': {
                if(B.Visual())    
                {
                   cout << endl;
                   cout << "cima  :" << B.Top() << endl;
                   cout << "fondo :" << B.Bottom() << endl;
                }                  
                else
                   cout << "PilaCoda vuota";
                break;}
                
             case 'z': {
                if(C.Visual())    
                {
                   cout << endl;
                   cout << "cima  :" << C.Top() << endl;
                   cout << "fondo :" << C.Bottom() << endl;
                }                  
                else
                   cout << "PilaCoda vuota";
                break;}
          }
          cout << endl;             
       }
       system("PAUSE");
       return EXIT_SUCCESS;
    }

  9. #9
    per eliminare una di queste strutture è sufficiente che esegui PopUp (o PopDown, ma PopUp è più efficiente) in un ciclo while tutte le volte che ti restituisce true e esci al false.

    while(a.PopUp()){}


    dovrebbe funzionare

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