AIUTO LISTE!

gliupun44
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!!

Risposte
giuscri
Sempre che abbia capito la domanda ...

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;

// ...

gliupun44
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?!

giuscri
"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à :roll:

claudio862
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.

gliupun44
Ok, credo di aver afferrato il concetto!

Grazie mille :)

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.