AIUTO LISTE!
struct nodo {
int key; //valore chiave
struct nodo *prox; //puntatore nodo successivo
};
typedef struct nodo NodiLista;
typedef NodiLista *LISTADEPTR;
Allora lo struct credo di aver capito a che cose serve: attravero lo struct io vado a creare un nodo formato da un valore e da un puntatore al nodo successivo.
Le altre due linee di codice però non le riesco a capire, potete spiegarmi cosa indicano? grazie mille!!
int key; //valore chiave
struct nodo *prox; //puntatore nodo successivo
};
typedef struct nodo NodiLista;
typedef NodiLista *LISTADEPTR;
Allora lo struct credo di aver capito a che cose serve: attravero lo struct io vado a creare un nodo formato da un valore e da un puntatore al nodo successivo.
Le altre due linee di codice però non le riesco a capire, potete spiegarmi cosa indicano? grazie mille!!
Risposte
Sempre che abbia capito la domanda ...
http://it.wikipedia.org/wiki/Typedef
Sul secondo onestamente non saprei.
Il primo ti permette di usare la struct riferendoti a quest'ultima con il nome NodiLista invece che nodo. Per esempio:
puoi scriverlo come
typedef struct nodo NodiLista; typedef NodiLista *LISTADEPTR;
http://it.wikipedia.org/wiki/Typedef
Sul secondo onestamente non saprei.
Il primo ti permette di usare la struct riferendoti a quest'ultima con il nome NodiLista invece che nodo. Per esempio:
//[IN C++]: // ... struct nodo { int key; nodo *prox }; nodo my_first_node; my_first_node.key = 5;
puoi scriverlo come
//[IN C++]: // ... struct nodo { int key; nodo *prox }; typedef struct nodo NodiLista; NodiLista my_first_node; my_first_node.key = 5; // ...
Forse non mi sono spiegata molto bene in effetti. Riguardo al "typedef struct nodo NodiLista;" non riesco a capire l'utilità di dichiarare un nuovo tipo quando si potrebbe benissimo utilizzare ad esempio nodo.key per accedere alla struttura!! E sembra che questa scritta sia una prassi nella definizione di una lista, mah
Mentre per quanto riguarda "typedef NodiLista *LISTADEPTR;" non riesco a capirne la funzione: sto dichiarando una puntatore al nodo?!

Mentre per quanto riguarda "typedef NodiLista *LISTADEPTR;" non riesco a capirne la funzione: sto dichiarando una puntatore al nodo?!
"gliupun":
Forse non mi sono spiegata molto bene in effetti. Riguardo al "typedef struct nodo NodiLista;" non riesco a capire l'utilità di dichiarare un nuovo tipo quando si potrebbe benissimo utilizzare ad esempio nodo.key per accedere alla struttura!! E sembra che questa scritta sia una prassi nella definizione di una lista, mah![]()
Mentre per quanto riguarda "typedef NodiLista *LISTADEPTR;" non riesco a capirne la funzione: sto dichiarando una puntatore al nodo?!
Onestamente avevo le tue stesse perplessità

struct nodo { int key; //valore chiave struct nodo *prox; //puntatore nodo successivo };
Per riferirti a questa struttura devi sempre (in C) usare
struct nodo
Ad esempio per dichiarare una funzione che accetta un nodo:
void f(struct nodo n);
Allora puoi definire un "alias", un nome alternativo per "struct nodo":
typedef struct nodo NodiLista;
Adesso "struct nodo" e "NodiLista" identificano lo stesso tipo, sono sinonimi. Quindi puoi riscrivere la funzione di prima così:
void f(NodiLista n);
È un modo per evitare di scrivere ogni volta la keyword "struct". In C++ la struttura genera anche un typedef implicito a "nodo", quindi puoi scrivere
void f(nodo n);
In generale l'istruzione
typedef TipoEsistente NuovoNome;
crea un sinonimo "NuovoNome" per il tipo "Tipo esistente". Quindi la seconda linea:
typedef NodiLista *LISTADEPTR;
che forse è più chiara così:
typedef NodiLista * LISTADEPTR;
crea un sinonimo per "NodiLista *" chiamato "LISTADEPTR". In sostanza "LISTADEPTR" è di tipo "struct nodo *", puntatore a nodo.
I principali motivi per usare typedef sono:
- Aumentare la leggibilità (soprattutto in C++ quando si usano classi con parametri template).
- Rendere il codice indipendente dal tipo effettivo. Ad esempio scrivendo una funzione che lavora su un tipo "REAL" e definendo tale tipo come "float", "double" o "long double" (o anche "int") prima della compilazione (l'idea è che "float" è più veloce ma meno preciso, anche se non è proprio così semplice).
- Rendere opaco un tipo. Es. definendo un sinonimo per "void *" e fornendo delle funzioni per creare e distruggere variabili di quel tipo, senza che il client sappia come siano effettivamente memorizzate.
- (In C++) metaprogrammazione e parziale reflection con i template.
Ok, credo di aver afferrato il concetto!
Grazie mille
Grazie mille
