Oltre ai pareri che ti hanno già dato Claudibus e Pasaran ti do anche il mio, allora, con typedef tu crei una definizione "Lista" al tipo di variabile struttura "Lista" , io, per abitudine, di solito non uso l'iniziale maiuscola nel tipo di variabile struttura e la uso nella definizione, cioè, per farti un esempio pratico:
codice:
typedef struct lista {
int valore;
char stringa;
struct lista *punta_lista;
} Lista;
Vedi la differenza nelle maiuscole rispetto alla tua struttura?
Questo ti permette ti fare una distinzione tra la definizione ed il nome della struttura.
Il significato di "struct lista *punta_lista;" te lo hanno già detto, nella pratica, ad esempio, potrebbe servirti nel caso volessi creare una lista lineare dove "struct lista *punta_lista;" è il puntatore da cui crei l'elemento successivo.
In effetti se il primo elemento della lista lo crei con questo frammento di codice:
codice:
Lista *puntatore_iniziale, *puntatore_scorre_lista;
puntatore_iniziale = (Lista *)malloc(sizeof(Lista));
....passi l'indirizzo contenuto in puntatore iniziale all'altro puntatore che creerà gli elementi successivi:
codice:
puntatore_scorre_lista = puntatore_iniziale;
....in modo da mantenere l'indirizzo di inizio lista, poi gli elementi seguenti li crei in quest'altro modo:
codice:
puntatore_scorre_lista->punta_lista = (Lista)malloc(sizeof(Lista));
....poi ti sposti nell'elemento appena creato:
codice:
puntatore_scorre_lista = puntatore_scorre_lista->punta_lista;
Per finire, come avrai notato con "typedef" ho evitato di definire il tipo della struttura ripetendo "struct lista" ma solo "Lista", però per creare il puntatore a se stessa all'interno della struttura ho "dovuto" usare "struct lista *punta_lista;" in quanto se avessi usato "Lista *punta_lista;" il compilatore mi avrebbe restituito un messaggio di errore.
Se non avessi avuto l'esigenza di creare una variabile struttura dello stesso tipo di se stessa all'interno avresti potuto omettere il termine "lista" in questo modo:
codice:
typedef struct {
int valore;
char stringa;
} Lista;
Questi principi ti sono molto utili anche nella creazione di strutture dati più complesse delle liste lineari quali, ad esempio, alberi e grafi.
Sò che questi argomenti non sono di certo facili nel C, però spero che questa mia risposta ti abbia chiarito un po più le idee .
Ciao
Gigi