PDA

Visualizza la versione completa : concetto pila[c++]


trek
15-04-2008, 16:35
ciao a tutti quacuno mi saprebbe dire gentilmente cosa fa in modo grafico questo frammento di codice in c ++??


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

:unz:

trek
15-04-2008, 16:38
scusate ma l'inserimento in fondo sarebbe il concetto di una coda ho sbagliato a scrivere scusate.

MacApp
15-04-2008, 16:49
Originariamente inviato da trek
ciao a tutti quacuno mi saprebbe dire gentilmente cosa fa in modo grafico questo frammento di codice in c ++??


Cosa intendi per modo grafico?

trek
15-04-2008, 17:01
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!

oregon
15-04-2008, 17:03
Beh ... ma mica ci si puo' mettere a "disegnare" per rispondere ai quesiti .... !

mondobimbi
15-04-2008, 17:18
// 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

KataKlism2002
15-04-2008, 17:37
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.



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".

trek
15-04-2008, 19:33
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.


#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;
}

KataKlism2002
15-04-2008, 21:38
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

Loading