Newsgroup: it.comp.lang.c++
Titolo: "Delete"are una lista collegata

Salve, come faccio a cancellare una lista collegata di record e
puntatori? Io facci ouna cosa del genere:
void cancella_lista ( nodo *inizio)	{
	nodo *scorri = inizio;
	nodo *temp = new nodo;
	for ( ; scorri->next; scorri = scorri->next);
	temp = scorri;
	scorri = 0;
	delete temp;
	cancella_lista(&inizio);
}
Ma non funziona. Potete aiutarmi?
Ciao e grazie.
Giacomo
 


Insomma, cosi' come e' non puo' funzionare. Tuttavia ti suggerisco di
rivedere
il tuo algoritmo invece che tentare di correggere gli errori. Non e' per
niente
logico fare un delete ricorsivo, perche' le funzioni ricorsive costano
in termini
di memoria, e nel caso di liste molto grandi ti troveresti nei
pasticci...
Un esempio per cancellare una lista:
void cancella_lista(nodo* inizio){
    if(inizio == 0) return; // qui controlli che la lista non sia vuota
    nodo* current = inizio; // qui definisci un puntatore a nodo e lo
inizializzi con
                                               // il valore di inizio
    nodo* next; // questo puntatore ti serve per memorizzare next
    while(current != 0){ // loop fino a quando ci sono elementi
        next  = current->next; // next punta al successivo elemento:
        delete current; // quindi possiamo cancellare l'elemento
corrente
        current = next; // e passare al next elemento...
    }
}

 Ma non funziona. Potete aiutarmi?
Per forza che non funziona. Eccoti la versione corretta:
void cancella_lista( nodo *inizio )
{
    nodo *temp;
    while ( inizio != NULL )
    {
        temp = inizio;
        inizio = inizio -> next;
        delete temp;
    }
}
Oppure usi il tipo std::list che non richiede distruzione esplicita.
EMG

    }
EMG !!!!!!
    while ( inizio != NULL )
    {
        temp = inizio->next ;
        delete inizio ;
        inizio = temp ;
    }


Se mi spieghi dov'č la differenza...
EMG

fine del programma
Perchč si ha un memory leakage? Uso delete apposta per cancellare
temp, quindi č normale che non abbia piů puntatori.
Per il resto grazie.
Giacomo.

 Giacomo.
riprendo il tuo codice:
void cancella_lista ( nodo *inizio)     {
        nodo *scorri = inizio;
*      nodo *temp = new nodo;
        for ( ; scorri->next; scorri = scorri->next);
*      temp = scorri;
        scorri = 0;
*      delete temp;
*      cancella_lista(&inizio);
}
segui quello che succede nelle righe con gli asterischi:
prima definisci un puntatore facendolo puntare ad una area di memoria
allocata
dinamicamente con new. A questo punto il valore di temp e', per esempio,
0x0000ddff (machine dependent!)
Dopodiche' assegni a temp il valore di scorri. A questo punto il valore di
temp e'
0x0000ffed, ovvero il valore di scorri: ora temp punta all'oggetto puntato da
scorri. Questo significa che non c'e' piu' nessun puntatore che punta
all'oggetto in precedenza allocato dinamicamente
dopodiche' deleti temp.Questa operazione libera la memoria occupata
dall'oggetto
puntato da temp, che e' l'oggetto puntato da scorri: non libera pero' la
memoria
occupata dall'oggetto a cui temp puntava prima di essere riassegnato. Nota
bene: se
l'oggetto puntato da scorri (e attualmente anche da temp) non e' stato
allocato con
l'uso di new ti trovi nei guai!
infine chiami ricorsivamente la tua funzione: quindi rifai lo stesso
giochetto, cioe'
allochi memoria dinamicamente, perdi il puntatore a questa memoria, allochi
memoria dinamicamente, perdi il puntatore a questa memoria etc. etc.
La morale e' sempre quella: se stai facendo queste cose per studiare la
Standard Library o la STL cercati informazioni accurate sugli algoritmi; se
invece ti stai riscrivendo del codice, allora usa senza alcun indugio
std::vector<> o std::list<> !
Ciao,
            Guido