Cancellare una lista - differenze tra due funzioni

di il
2 risposte

Cancellare una lista - differenze tra due funzioni

Secondo voi quale critica muovere verso i due algoritmi di cancellazione lista?
Il primo è frutto del mio operato mentre il secondo è una soluzione utilizzata dal docente.
testa rappresenta il puntatore della lista.
A mio avviso non c'e' alcuna differenza funzionale ma nel primo caso mi risparmio un puntatore.
Cosa ne pensate?
struct elem {
int inf;
elem* pun;
};

elem* tmp;
while (testa!=NULL) {
tmp=testa;
testa=testa->pun;
delete tmp;
}

elem *p=testa, *q;
while (p) {
q = p->pun;
delete p;
p = q;
}

2 Risposte

  • Re: Cancellare una lista - differenze tra due funzioni

    Sicuramente la tua versione ha il pregio di essere più chiara e di risparmiare un puntatore, in ogni caso penso che la questione fondamentale sia un'altra... alla fine del processo di eliminazione avrò una lista vuota e mi aspetto che al ritorno nel main il puntatore testa punti a NULL, sei d'accordo?
    Nel codice del prof questo sicuramente non avviene, nel tuo dipende dal modo in cui hai passato il parametro testa alla funzione.
  • Re: Cancellare una lista - differenze tra due funzioni

    Se formatti le due versioni usando gli stessi nomi ti accorgi che cambia praticamente nulla.
    void DeleteList1(_Node *p)
    {
    	_Node *tmp;
    
    	while ( p )
    	{
    		tmp = p->next;
    		delete p;
    		p = tmp;
    	}
    }
    
    void DeleteList2(_Node *p)
    {
    	_Node *tmp;
    
    	while ( p )
    	{
    		tmp = p;
    		p = p->next;
    		delete tmp;
    	}
    }
    Nella prima forma memorizzi l'indirizzo del nodo successivo, elimini il nodo corrente e poi
    aggiorni il puntatore al nodo corrente con l'indirizzo del nodo successivo. Nella seconda forma
    memorizzi l'indirizzo del nodo corrente, aggiorni il puntatore al nodo corrente con
    l'indirizzo del nodo successivo e dunque elimini il nodo corrente.

    Forse la seconda è più elegante?

    Poi, come scrive Nippolo, la cosa importante è che dopo aver eliminato tutti i nodi della lista, il puntatore globale alla testa della lista riceva il valore zero.
Devi accedere o registrarti per scrivere nel forum
2 risposte