Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - [C++] Visualizzare elementi in uno stack
Forum - C/C++ - [C++] Visualizzare elementi in uno stack

Avatar
Fe10 (Normal User)
Newbie


Messaggi: 3
Iscritto: 02/02/2012

Segnala al moderatore
Postato alle 19:51
Lunedì, 06/02/2012
Buonasera,
sto studiando il c++ alle superiori e in particolare le liste statiche e dinamiche(coda e pila). Mi è stato assegnato il compito di scrivere una funzione che permetta di visualizzare tutti gli elementi presenti in uno stack dinamico. Visto che abbiamo studiato anche le funzioni ricorsive, mi è stato suggerito di richiamare un'altra funzione che sia ricorsiva a se stessa del tipo:

Codice sorgente - presumibilmente C/C++

  1. void f1 (stack s)
  2. {
  3.       ........
  4.       f2(s.testa) /*ricorsiva a se stessa*/
  5.       .....
  6. }



Visto che nella funzione di visualizzazione di uno stack dinamico è presente un'iterazione e una funzione ricorsiva può sostituire l'iterazione ho pensato a queste due funzioni:

Codice sorgente - presumibilmente C/C++

  1. bool visstack (stack s)
  2. {
  3.         bool ris=false;
  4.         nodo *n;
  5.         n=s.testa;
  6.         if(!(stackvuoto(s)))
  7.         {
  8.               ris=true;
  9.               f1_ricorsiva (s.testa);
  10.         }
  11.         return ris;
  12. }



Codice sorgente - presumibilmente C/C++

  1. void f1_ricorsiva (nodo *p)
  2. {
  3.     bool ris=false;
  4.     if((p->next!=NULL)||(ris=true))
  5.     {
  6.         ris=true;
  7.         viselemento (p->info);
  8.         f1_ricorsiva (p->next);
  9.     }
  10.     return;
  11. }



Quando vado a compilare il progetto non ci sono errori di compilazione, ma quando vado a richiamare la funzione di visualizzazione, la visualizzazione va a buon fine, cioè riesco a visualizzare tutti gli elementi che ho inserito precedentemente, ma il compilatore crasha.

Dov'è il problema? :-?:-?

Grazie,
Fe10.

Ultima modifica effettuata da Fe10 il 06/02/2012 alle 22:06
PM Quote
Avatar
andrex91 (Member)
Pro


Messaggi: 101
Iscritto: 01/05/2009

Segnala al moderatore
Postato alle 9:06
Martedì, 07/02/2012
if((p->next!=NULL)||(ris==true))


altrimenti l'OR risulta sempre verificato.
Comunque cosi come è fatta f1_ricorsiva ris è inutile

Ultima modifica effettuata da andrex91 il 07/02/2012 alle 9:08


Provare e riprovare
PM Quote
Avatar
Fe10 (Normal User)
Newbie


Messaggi: 3
Iscritto: 02/02/2012

Segnala al moderatore
Postato alle 15:25
Martedì, 07/02/2012
Testo quotato

Postato originariamente da andrex91:

if((p->next!=NULL)||(ris==true))


altrimenti l'OR risulta sempre verificato.
Comunque cosi come è fatta f1_ricorsiva ris è inutile


Ma senza quella condizione ris==true, con i vari esperimenti, non mi si chiudevano le funzioni. L'ho messo solo per far si che ritorni alla funzione di partenza...

EDIT: il programma crasha comunque in fase di visualizzazione...

Ultima modifica effettuata da Fe10 il 07/02/2012 alle 15:37
PM Quote
Avatar
andrex91 (Member)
Pro


Messaggi: 101
Iscritto: 01/05/2009

Segnala al moderatore
Postato alle 9:30
Mercoledì, 08/02/2012
Ho anche notato che l'ultimo elemento non ti verrà mai visualizzato (se ti viene visualizzato allora probabilmente (p->next!=NULL) viene verificata anche quando sei in fondo allo stack, ma se sei all'ultimo elemento, p->next non dovrebbe puntare a nulla.
Prova a postare il codice relativo allo stack

ps. per la funzione ricorsiva ti consiglio di fare qualcosa del tipo

Codice sorgente - presumibilmente C/C++

  1. if( p == NULL )return;
  2. viselemento (p->info);        
  3. f1_ricorsiva (p->next);


Ultima modifica effettuata da andrex91 il 08/02/2012 alle 9:38


Provare e riprovare
PM Quote
Avatar
Fe10 (Normal User)
Newbie


Messaggi: 3
Iscritto: 02/02/2012

Segnala al moderatore
Postato alle 14:18
Mercoledì, 08/02/2012
Ho risolto modificando la funzione in:

Codice sorgente - presumibilmente C/C++

  1. void f1_ricorsiva (nodo *p)
  2. {
  3.     if(p!=NULL)
  4.     {
  5.         viselemento (p->info);
  6.         f1_ricorsiva (p->next);
  7.     }
  8.     return;
  9. }



Grazie :D

PM Quote