Lista rovesciata in C

di il
5 risposte

Lista rovesciata in C

Salve ragazzi sapreste per caso dirmi come potrei creare una funzione che mi permetta di rovesciare una lista? Vorrei, se è possibile, più che il codice, una spiegazione ed un ragionamento per capire e poi provare da solo. Grazie mille

5 Risposte

  • Re: Lista rovesciata in C

    In generale, basta percorrere la lista al contrario, da tail a head, invertendo i puntatori prev e next.
  • Re: Lista rovesciata in C

    Secondo te è giusto così?
    t_list lista_rovesciata(t_list lista){
    
         t_list sec,coda,tmp;
    
         coda=lista;
         sec=lista->link;
         coda->link=NULL;
         tmp=coda;
    
        while (sec != NULL){
            coda=sec;
            coda->link=tmp;
            tmp=coda;
            sec=sec->link;
        }
        return coda;   
    }
  • Re: Lista rovesciata in C

    Non del tutto.

    Eri sulla buona strada, ma non hai considerato bene l'ordine delle istruzioni: cambi troppo tardi il valore di sec, che a quel punto è già stato modificato con
    
    coda->link=tmp;
    
    dove coda punta a sec.

    quindi prima di modificare coda devi sposare sec avanti di un elemento.
    
    t_list lista_rovesciata(t_list lista)
    {
    
    	t_list sec, coda, tmp;
    
    	coda = lista;
    	sec = lista->link;
    	coda->link = NULL;
    	tmp = coda;
    
    	while (sec != NULL)
    	{
    		coda = sec;
    		sec = sec->link;
    		coda->link = tmp;
    		tmp = coda;
    	}
    
    	return coda;
    }
    
    Piccola nota: vedo dal tuo codice che hai dichiarato il tipo t_list come puntatore. Non farlo mai, utilizza sempre il "tipo puro" e metti nel codice gli asterischi dove servono, ovvero:
    
    typedef struct list
    {
    	int n;
    
    	struct list *link;
    
    }t_list;
    
    t_list *lista_rovesciata(t_list *lista)
    {
    
    	t_list *sec, *coda, *tmp;
    
    	coda = lista;
    	sec = lista->link;
    	coda->link = NULL;
    	tmp = coda;
    
    	while (sec != NULL)
    	{
    		coda = sec;
    		sec = sec->link;
    		coda->link = tmp;
    		tmp = coda;
    	}
    
    	return coda;
    }
    
  • Re: Lista rovesciata in C

    Ti ringrazio sei un grande

    Sono stato abitutato così ma proverò a cambiare, sai spiegarmi perchè è meglio così?
  • Re: Lista rovesciata in C

    Per una questione di leggibilità. Pensa di avere un software con decine di file sorgente e headers. e di dover creare una funzione che usi il tuo tipo t_list.

    scrivendo
    
    bool foo(t_list bar)
    
    se sei furbo ti chiederai cosa è t_list, ma se non lo sei potresti pensare che sia una variabile semplice e non un puntatore. Potresti addirittura arrivare a scrivere
    
    bool foo(t_list *bar)
    
    Pensando di implementare una funzione che vuole in input un puntatore, con il risultato però di ottenere una funzione che vuole un puntatore di puntatore.

    In poche parole, nascondere che un tipo è di per se un puntatore non è una grande idea quando il tuo codice viene utilizzato da più persone, o quando tu stesso non ci lavori da molto e perdi memoria di quello che hai fatto.

    Considera poi se il tuo codice è una libreria che viene utilizzata da persone terze che si trovano a utilizzare la tua interfaccia: se vedono un'asterisco nella dichiarazione del parametro della funzione sanno immediatamente cosa passare alla funzione, nell'altro caso sbaglieranno di sicuro, e il compilatore potrebbe non dirlo nemmeno.

    Utilizzare il carattere * non consuma + memoria se non per qualche decina di byte nel file sorgente, quindi esplicita sempre i puntatori do not typedef pointers ...
Devi accedere o registrarti per scrivere nel forum
5 risposte