RISOLTO Dichiarazione Lista Dinamica

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.

Vito-

Utente Attivo
Messaggi
193
Reazioni
15
Punteggio
43
C:
struct EL {
TipoElemento Info;
struct EL *Prox;
 };
typedef struct EL ElemLista;
typedef ElemLista *ListaDiElem;
Ciao, sul libro é riportato questo esempio per spiegare la dichiarazione di una lista dinamica. Non sto ben riuscendo a capire.
EL é il nome della struct. TipoElemento é un nuovo tipo che sará stato definito prima e Info é il nome di questo elemento. Finqui giusto?


Non riesco a capire invece
C:
struct EL *Prox;
questa stringa...



Qui
C:
typedef struct EL ElemLista;
typedef ElemLista *ListaDiElem;
crea un nuovo tipo e nell'ultima stringa crea un puntatore ad ElemLista.


Giusto tutto quello che ho detto?
 
C:
struct EL {
TipoElemento Info;
struct EL *Prox;
 };
typedef struct EL ElemLista;
typedef ElemLista *ListaDiElem;
Ciao, sul libro é riportato questo esempio per spiegare la dichiarazione di una lista dinamica. Non sto ben riuscendo a capire.
EL é il nome della struct. TipoElemento é un nuovo tipo che sará stato definito prima e Info é il nome di questo elemento. Finqui giusto?
Si, corretto. In quell'esempio però magari TipoElemento è messo giusto come placeholder, per indicarti che potrebbe essere int, double... etc etc.

Non riesco a capire invece
C:
struct EL *Prox;
questa stringa...

Questo è un puntatore alla struttura EL. L'ha chiamato "Prox" per indicare che punterà al prossimo elemento della lista. E' del tutto comune, potresti avere come esempio "reale" successivo una cosa tipo:

C:
typedef struct Node {
    int value;
    struct Node *next;
} node;

Node rappresenta un elemento che ha un suo "value", e ogni Node è collegato (perchè punta) al nodo successivo.

Qui
C:
typedef struct EL ElemLista;
typedef ElemLista *ListaDiElem;
crea un nuovo tipo e nell'ultima stringa crea un puntatore ad ElemLista.

Giusto tutto quello che ho detto?

Si, è un puntatore di tipo ElemLista. Forse utilizza un pò troppi typedef comunque... di solito non se ne dovrebbe abusare.

E' comune anche dichiarare una struct in questo modo:

C:
typedef struct Node {
    int value;
    //....altri membri
} node, *pnode;

così "node" è la struttura e "pnode" è un puntatore a una strutture Node.
 
Si, corretto. In quell'esempio però magari TipoElemento è messo giusto come placeholder, per indicarti che potrebbe essere int, double... etc etc.



Questo è un puntatore alla struttura EL. L'ha chiamato "Prox" per indicare che punterà al prossimo elemento della lista. E' del tutto comune, potresti avere come esempio "reale" successivo una cosa tipo:

C:
typedef struct Node {
    int value;
    struct Node *next;
} node;

Node rappresenta un elemento che ha un suo "value", e ogni Node è collegato (perchè punta) al nodo successivo.



Si, è un puntatore di tipo ElemLista. Forse utilizza un pò troppi typedef comunque... di solito non se ne dovrebbe abusare.

E' comune anche dichiarare una struct in questo modo:

C:
typedef struct Node {
    int value;
    //....altri membri
} node, *pnode;

così "node" è la struttura e "pnode" è un puntatore a una strutture Node.
ti ringrazio
 
Qui
C:
typedef struct EL ElemLista;
typedef ElemLista *ListaDiElem;
crea un nuovo tipo e nell'ultima stringa crea un puntatore ad ElemLista.


Giusto tutto quello che ho detto?
No, l’istruzione typedef non crea nessuna variabile, definisce semplicemente un nuovo tipo, solo per comodità di scrittura, in modo che tu possa scrivere solo ListaDiElem invece che struct El *. Che come dice giustamente @DispatchCode risulta ridondante, la comodità di battere meno tasti in questo caso rende la lettura del codice più difficile. Non bisognerebbe mai esagerare con i typedef.

L’uso del typedef è

Typedef <tipo> nomeSimbolico;
Per esempio

typedef unsigned int uint;

Che semplicemente definisce un nuovo tipo (uint) che è di fatto un intero senza segno. Quindi queste due dichiarazioni sono equivalenti:

unsigned int pippo; uint pluto;

Come vedi si risparmia la battitura di alcuni tasti e il codice è più conciso, ma è anche più difficile da leggere perché richiede di sapere come sia stato definito uint.
 
Mi sono dimenticato di dire quanto avevo anche detto nel precedente topic: typedef in realtà non crea un nuovo tipo, ma è un alias del tipo; come dice giustamente Andretti, evita ripetizioni (ed eviti il "tempo di battitura").

Faccio un esempio pratico e concreto, come quello di Andretti, di ciò che si trova nel porting di GCC (MinGw, Windows, ho preso il primo codice trovato, non è sicuro l'ultima versione): https://www.rpi.edu/dept/cis/software/g77-mingw32/include/stdint.h

C:
typedef signed char int8_t;
typedef unsigned char   uint8_t;
typedef short  int16_t;
typedef unsigned short  uint16_t;
typedef int  int32_t;
typedef unsigned   uint32_t;
typedef long long  int64_t;
typedef unsigned long long   uint64_t;

invece di scrivere ad esempio unsigned long long utilizzando questo header (stdint.h) vai ad utilizzare direttamente uint64_t: non è che è stato creato un tipo nuovo, quando usi uint64_t stai risparmiando tempo (e rendi anche più facile la lettura, forse) rispetto a unsigned long long.
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top