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