Oppure

Loading
06/02/12 18:51
Fe10
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:

void f1 (stack s)
{
      ........
      f2(s.testa) /*ricorsiva a se stessa*/ 
      .....
}


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:

bool visstack (stack s)
{
	bool ris=false;
	nodo *n;
	n=s.testa;
	if(!(stackvuoto(s)))
	{
	      ris=true;
	      f1_ricorsiva (s.testa);
        }
	return ris;
}


void f1_ricorsiva (nodo *p)
{
    bool ris=false;
    if((p->next!=NULL)||(ris=true))
    {
        ris=true;
        viselemento (p->info);
        f1_ricorsiva (p->next);
    }
    return;
}


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 06/02/12 21:06
aaa
07/02/12 8:06
andrex91
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 07/02/12 8:08
aaa
07/02/12 14:25
Fe10
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 07/02/12 14:37
aaa
08/02/12 8:30
andrex91
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

if( p == NULL )return;
viselemento (p->info);         
f1_ricorsiva (p->next); 
Ultima modifica effettuata da andrex91 08/02/12 8:38
aaa
08/02/12 13:18
Fe10
Ho risolto modificando la funzione in:

void f1_ricorsiva (nodo *p)
{
    if(p!=NULL)
    {
        viselemento (p->info);
        f1_ricorsiva (p->next);
    }
    return;
}


Grazie :D
aaa