Newsgroup: it.comp.lang.c++
Titolo: metodo per "poppare" l'ultimo elemento di una lista

Ciao ragazzi, nn riesco proprio a raccapezzarmi cn questa parte di codice
eppure dovrebbe essere piuttosto semplice...
1     template <class type>
2     type lista<type> : : pop_back ()
3     {
4
5         if ( curr != NULL)            // la variabile CURR è un puntatore,
la root della lista
6        {
7         LIST* scan = curr;            // faccio in modo che una variabile
temporanea punti alla root....
8
9         while ( scan->next != NULL)        // ....per poi scorrere lungo
la lista fino a trovare l'ultimo elemento
10          scan = scan->next;
11
12           type t = scan->el;                    // a questo punto "SCAN"
dovrebbe puntare all'ultimo elemento pertanto copio in T il membro EL della
struttura
13
14
15          delete scan;                            // rilascio la memoria
occupata dall'ultimo elemento
16          return t;                                  // e ritorno la
variabile T d tipo TYPE
17      }
18
19         return -1;                                // Se curr (la root) è
uguale a NULL, la lista è vuota perciò ritorno -1 come "codice d'errore"
20     };
il problema si verifica alla riga numero 15, al rilascio della memoria
occupata da scan...
il caro vecchio VC++6 asserta qualcosa di impronunciabile, credo sia un
puntatore che punti a qualcosa a cui nn dovrebbe puntare (scusate il gioco
di parole..)
ma proprio nn lo vedo, mi dareste una mano? grazie!!


quando fai delete scan l'elemento precedente della lista rimane agganciato
ad un elemento non piů esistente, infatti il suo membro next non viene
modificato
Pela


quindi, come risolvo la cosa?
se dopo aver rimosso l'elemento scan, lo metto uguale a NULL, il problema mi
si ripresenta

 quindi, come risolvo la cosa?
Scrivendo un programma corretto?
Studiando, prima di prendere un insufficienza all'esame per il quale
stai tentando di barare?
Pregando Padre Pio?
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Dept. of Physics, Univ. of Padova, Italy          loreti at pd dot infn dot it

 Maurizio Loreti
http://www.pd.infn.it/~loreti/mlo.html
1) nn ho chiesto di riscrivermi il programma, ma solo di farmi capire come
"aggiustare" la parte di codice sbagliata
2) se avessi letto post invece di saltare a conclusioni m avresti
risparmiato  un post inutile e soprattuto lo avresti risparmiato a te
3) pregherò padre pio per te
bye bye

Modificando il codice in questo modo
if (curr != NULL)
{LIST *scan, *prec;
 for (prec = NULL, scan = curr; scan->next != NULL; prec = scan,
       scan = scan->next);
 if (prec != NULL)
  prec = scan->next;    //  elimini un elemento intermedio
 else
 curr = scan->next;    //  elimini il primo elemento della lista
 type t = scan->el;
 delete scan;
 return t;
}
return -1;
In questo modo prec punta all'elemento precedente: se cancelli un nodo
intermedio (cioé non il primo della lista) hai un elemento precedente e lo
attacchi al successivo di quello da rimuovere (per bypassarlo); se il
precedente è NULL devi rimuovere il nodo in testa alla lista e, perciò, devi
aggiornare il puntatore alla testa. Spero che funzioni (l'ho scritto di
getto). Ciao
Marchisio Stefano


t ringrazio, funziona a dovere, ciao!

 3) pregherň padre pio per te
Grazie.
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html


 Grazie.
prego
ps: se magari evitassimo il flame sarebbe una gran cosa...

 programma, ma solo l'errore che avevo commesso, com'č giusto che sia!!!!
mi correggo, stefano mi ha mostrato il programma corretto ed ho
ringraziato..

 attacchi al successivo di quello da rimuovere (per bypassarlo);
Appunto.
Ciao
--
zello