Beh, non è la stessa cosa perché m_pHead è inteso come variabile membro privata e pertanto globale (== visibile) tra tutti i metodi, pensavo fosse esplicito perché l'ho scritta utilizzando la notazione: m_(eccetera).
Ma l'ho impiegata solo per rendere chiaro che la testa della lista deve essere visibile e condivisa all'interno di ogni metodo. ...ad esempio anche utilizzando il puntatore "testa" proprio come fai nella funzione
inserisci_in_testa, allora salta fuori una cosa simile:
bool DeleteOneNode(nodo *& testa, size_t val)
{
/* Elimina un solo e unico nodo.
*
* size_t val nodo per valore da eliminare.
*
* Return value
* true se un nodo è stato eliminato,
* false se il nodo non è stato trovato.
*/
nodo *P = testa;
nodo *prec = nullptr;
if( !P ) // Lista vuota.
return false;
if( P->val == i ) // Se è il primo nodo:
{
testa = P->ptr; // imposta il nodo sucessivo come nuova testa della lista;
delete P; // libera il primo elemento.
// P = testa; // Inutile in tal caso perché termina con il ritorno di true.
return true;
}
while( P ) // Non è il primo nodo:
{
if( P->val == i )
{
// Sicuramente ha saltato il primo ciclo e pertanto 'prec' non può essere nullo.
prec->ptr = P->ptr; // Collega il nodo precedente al sucessivo.
delete P; // Libera il nodo corrente.
return true;
}
prec = P;
P = P->ptr;
}
return false;
}
Mi esprimo nei commenti al codice di questa funzione
DeleteOneNode che adopero a titolo di esempio e in cui noterai che ho voluto semplificare il codice. Prova ad adattarla alle tue esigenze e fammi sapere.