Dubbio dichiarazione liste

di il
15 risposte

Dubbio dichiarazione liste

Salve, ultimamente sto affrontando lo studio di liste, code e pile a livello universitario..
Allora più precisamente ho un dubbio nella dichiarazione delle liste (premetto che è da un pò che non trattavo questo argomento).
Allora io ero abituato a dichiararle così:

typedef struct Nodo {
	int dato;
	struct Nodo *next;
} Nodo;

typedef struct Lista{
	Nodo *next;
} Lista;
Adesso in alcuni esercizi è richiesto di usare invece questa dichiarazione:

struct el
{
	int info;
	struct el *next;
}
typedef struct el ElementoDiLista;
typedef ElementoDiLista* ListaDiElementi; 
Non capisco a cosa mi serve quel "ListaDiElementi", potreste spiegarmi?
Grazie.

15 Risposte

  • Re: Dubbio dichiarazione liste

    E' il puntatore all'inizio della lista.

    Guarda che sono modalità simili.
    E' equivalente al puntatore next nella struttura Lista. Non serve una struttura per contenere il puntatore alla lista.
  • Re: Dubbio dichiarazione liste

    Ah ho capito quindi in pratica sono dichiarazioni equivalenti e la seconda notazione è anche meno "pesante" della prima, giusto?
  • Re: Dubbio dichiarazione liste

    E' sicuramente più chiara ... potrebbe essere anche meglio
    
    struct _Nodo
    {
    	int info;
    	struct el *next;
    };
    
    typedef struct _Nodo Nodo;
    typedef Nodo *topLista;
    
  • Re: Dubbio dichiarazione liste

    oregon ha scritto:


    E' il puntatore all'inizio della lista.

    Guarda che sono modalità simili.
    E' equivalente al puntatore next nella struttura Lista. Non serve una struttura per contenere il puntatore alla lista.
    Concordo, ma preciserei che quel "ListaDiElementi" non è solo "il puntatore all'inizio della lista", ma un generico puntatore a struct el.

    oregon ha scritto:


    E' sicuramente più chiara ... potrebbe essere anche meglio
    
    struct _Nodo
    {
    	int info;
    	struct el *next;
    };
    
    typedef struct _Nodo Nodo;
    typedef Nodo *topLista;
    
    Occhio al tipo del membro next!

    In ogni caso @LuigiC++ ti consiglio di ridurre al minimo l'utilizzo dei typedef, infatti la maggiore semplicità/chiarezza che ne deriva è solo apparente e rischia di confondere sia il programmatore sia chi il codice lo legge, soprattutto se si scelgono degli identificatori (dei nomi) non adeguati.
    Quindi se fossi in te mi limiterei semplicemente a:
    typedef struct nodo_
    {
    	int data;
    	struct nodo_ *next;
    }	nodo;
    inoltre se il linguaggio, stando anche al tuo nick, è il C++, non c'è neanche bisogno del typedef, perchè la definizione di una struct comporta la creazione di un nuovo tipo.
  • Re: Dubbio dichiarazione liste

    Evidente refuso da frettoloso copia incolla
    
    struct _Nodo
    {
    	int info;
    	struct _Nodo *next;
    };
    
    ma sono sicuro che Luigi lo ha notato e compreso. Grazie per la tua grande attenzione.

    Per i typedef certamente è sconsigliabile usarli in generale. Se usati, va fatto in maniera molto precisa.

    Se ho un unsigned long e con il typedef diventa un vl_abc sicuramente avrò reso più "opaco" il codice (e sarà meno leggibile).
    Ma un typedef di tipo "parlante" può contribuire a ridurre la lunghezza del codice sorgente e a migliorare un po' l' "astrazione"
    Proprio in una struttura che è un nodo di una lista, non dover scrivere sempre

    struct Nodo ...

    ma semplicemente

    Nodo

    o pNodo per il puntatore alla struttura, sicuramente migliora la siturazione (ovviamente per il C).
  • Re: Dubbio dichiarazione liste

    Ciao grazie a tutti per le risposte.
    Allora il linguaggio che usavo principalmente era C++, ora con l'università è diventato C (al primo anno).
    Per quanto riguarda typedef se non fosse che il professore lo richiede nella dichiarazione non lo userei nemmeno io. Questa mattina inoltre mi stavo esercitando e ho fatto questo
    
    	ListaDiElementi testa;
    	testa->next = NULL;
    	
    	ElementoDiLista* el1 = (ElementoDiLista *)malloc(sizeof(ElementoDiLista));
    	ElementoDiLista* el2 = (ElementoDiLista *)malloc(sizeof(ElementoDiLista));
    	ElementoDiLista* el3 = (ElementoDiLista *)malloc(sizeof(ElementoDiLista));
    	
    	el1->info = 5;
    	el1->next = NULL;
    	testa->next = el1;
    	
    	el2->info = 8;
    	el2->next = testa->next;
    	testa->next = el2;
    	
    	el3->info = 9;
    	el3->next = testa->next;
    	testa->next = el3;
    	
    	
    	ListaDiElementi temp = testa->next;
    	while(temp && temp->next) {
    		printf("%d-> ", temp->info);
    		temp = temp->next;
    	}
    	printf("%d\n", temp->info);
    	
    	return 0;
    
    
    con la dichiarazione che vi ho mostrato sopra. Il problema è che non stampa nulla, come mai?
    Quello che ho fatto dovrebbe essere un inserimento in testa, senza usare alcuna funzione, semplicemente per capire l'uso dei vari elementi, ma non va...
  • Re: Dubbio dichiarazione liste

    Mi sa che ci sono parecchi errori ... faccio prima a mostrarti questo
    
    int main()
    {
    	ElementoDiLista* el1 = (ElementoDiLista *)malloc(sizeof(ElementoDiLista));
    	ElementoDiLista* el2 = (ElementoDiLista *)malloc(sizeof(ElementoDiLista));
    	ElementoDiLista* el3 = (ElementoDiLista *)malloc(sizeof(ElementoDiLista));
    
    	ListaDiElementi testa = el1;
    
    	el1->info = 5;
    	el1->next = el2;
    
    	el2->info = 8;
    	el2->next = el3;
    
    	el3->info = 9;
    	el3->next = NULL;
    
    	ListaDiElementi temp = testa;
    	while (temp) 
    	{
    		printf("%d-> ", temp->info);
    		temp = temp->next;
    	}
    	printf("(NULL)\n");
    
    	return 0;
    }
    
  • Re: Dubbio dichiarazione liste

    Ok ma l'output del tuo esercizio è 5->8->9 (non avremmo nemmeno bisogno dell'elemento testa), e lo so fare molto bene.
    Io voglio un output del tipo 9->8->5, che sarebbe quello di un generico inserimento in testa. Quindi in realtà testa dovrebbe puntare a 9, non a 5.
    Non so se mi sono spiegato..
  • Re: Dubbio dichiarazione liste

    E non riesci a modificare il mio codice per farlo?
  • Re: Dubbio dichiarazione liste

    Ho fatto qualche prova e così funziona, ora l'output che ottengo è proprio 9->8->5->
    
    	ListaDiElementi testa;
    	
    	ElementoDiLista* el1 = (ElementoDiLista *)malloc(sizeof(ElementoDiLista));
    	ElementoDiLista* el2 = (ElementoDiLista *)malloc(sizeof(ElementoDiLista));
    	ElementoDiLista* el3 = (ElementoDiLista *)malloc(sizeof(ElementoDiLista));
    	
    	el1->info = 5;
    	el1->next = NULL; // NULL perchè sarà lui l'ultimo elemento che verrà stampato
    	testa = el1;
    	
    	el2->info = 8;
    	el2->next = testa;
    	testa = el2;
    	
    	el3->info = 9;
    	el3->next = testa;
    	testa = el3;
    	
    	ListaDiElementi temp = testa;
    	
    	while(temp) {
    		printf("%d-> ", temp->info);
    		temp = temp->next;
    	}
    
    L'errore era in quel "testa->next" quindi..(?)
  • Re: Dubbio dichiarazione liste

    Evidente. Come fai ad usare next se testa non ha ancora un valore?
  • Re: Dubbio dichiarazione liste

    E' vero, era un'assurdità quella che avevo scritto
    Grazie mille per l'aiuto e per i vari consigli!
  • Re: Dubbio dichiarazione liste

    Ciao, riattivo per un attimo questa discussione per chiedere un'altra cosa. Sto creando delle funzioni per ogni cosa che possiamo fare sulle liste (ins in testa, in coda, stampa, etc).
    Le dichiarazioni sono quelle del precedente esempio e nel main ho
    ListaDiElementi Testa = NULL;
    .
    Ora non posto tutto il codice ma immagina che con un ciclo richiami tot volte la funzione di inserimento in testa.

    Il dubbio è, il parametro di tale funzione (quello per aggiornare Testa nel main) dovrà essere di tipo
    ListaDiElementi* testa
    o
    ListaDiElementi testa
    ? Quindi dovrò passare &Testa o semplicimente Testa?
  • Re: Dubbio dichiarazione liste

    Se la funzione è void e devi modificare testa, la prima. Se la funzione restituisce il nuovo puntatore da assegnare nel main, la seconda.
Devi accedere o registrarti per scrivere nel forum
15 risposte