2015-11-30 16 views
5

Si prega di vedere questo blocco di codice:Che cosa esattamente typedef struct node {...} Node; rappresentare?

typedef struct node 
{ 
    int data; 
    struct node *next; 
} 
Node; 

In questo codice, è sinonimo di Nodestruct node, come definiti da typedef, o è node sinonimo di struct? Se quest'ultimo è il caso, allora è struct node *next; equivalente a struct struct *next;?

Sono troppo complicato?

+0

tua struct è parte di un costrutto di solito chiamato "lista collegata". Cercalo se vuoi sapere come usarlo e perché hai scritto 'struct node * next'. Per quanto riguarda la tua domanda, con 'struct node {...};' nel tuo codice dovresti dichiarare variabili come 'struct node mynode1;'. Usando 'typedef struct node Node;' devi solo scrivere 'Node mynode1' – frarugi87

+0

Penso che generi un errore ...' Node * hashtable [SIZE] ', dall'altra parte, genera una matrice con elementi SIZE; ognuno di essi è un puntatore a un nodo struct (e quindi, dal momento che ogni struct può essere considerata la testa di una lista, è una matrice di liste SIZE, oppure può essere una matrice con puntatori a vari elementi della stessa lista, dipende da come lo si usa) – frarugi87

+0

@ frarugi87 Perché 'int x;' dichiara un puntatore a un int chiamato x senza un pointee, mentre 'Node * hashtable [SIZE];' dichiara una matrice di puntatori SIZE che puntano a 'Node' ('Node' è la punta)? – gabece

risposta

11

Quando si utilizza typedef si crea un alias di qualche tipo.

Quindi sì, Node è uno pseudonimo per struct node.


Inoltre, il codice che avete è equivalente a

struct node 
{ 
    int data; 
    struct node *next; 
}; 
typedef struct node Node; 

Il typedef non è parte della definizione della struttura, è parte della definizione Node.

+0

Grazie per la tua risposta! Inoltre, nodo * hashtable [SIZE]; dichiarare un puntatore struct a una matrice denominata hashtable di alcune dimensioni? – gabece

+0

@PurpleYoshiii Se si intende 'Nodo * hashtable [SIZE];' (notare il maiuscolo 'N' in' Nodo'), quindi questa è una dichiarazione di una matrice di puntatori 'SIZE' su' Nodo'. Fondamentalmente una serie di liste in questo caso specifico. –

+0

Quindi, 'Nodo * hashtable [SIZE];' dichiara una matrice di puntatori SIZE che puntano a 'Node'? Se questo è il caso, allora perché 'int * x;' dichiara solo un puntatore int chiamato x senza un pointee, mentre 'Node * hashtable [SIZE];' dichiara una matrice di puntatori SIZE che puntano a 'Node' (' Node 'essere il pointee). – gabece

4

Node è sinonimo di struct node. Ecco perché (per il vostro esempio) invece di utilizzare

struct node* p; 

si può usare

Node* p; 
1

non è più necessario scrivere struct dappertutto. Ciò non solo risparmia i tasti, ma può anche rendere il codice più pulito poiché fornisce una più piccola astrazione.

Cose come

typedef struct { 
    int x, y; 
} Point; 

Point point_new(int x, int y) 
{ 
    Point a; 
    a.x = x; 
    a.y = y; 
    return a; 
} 
1
typedef struct node 
{ 
    int data; 
    struct node *next; 
} 
Node; 

Questo può essere compreso semplicemente

struct node 
{ 
    int data; 
    struct node *next; 
}; 

    typedef struct node Node; 

struct [structure tag or label] { 

    member definition; 
    ... 
    member definition; 
} [one or more structure variables]; 

nuova variabile può essere definita come:

struct label <variable>; 

o se si utilizza typedef struct etichetta non ha bisogno di essere ripetuta ogni volta per definire nuova variabile di struttura cioè

typedef struct label Node; 

Ora nodo può essere impiegato per definire nuovo tipo simile di variabile.

+1

infatti, è' typedef struct node Node; ', non solo' nodo' – frarugi87

+0

T hanks, l'ho dimenticato :-) –

2

Nelle strutture grammaticali C sono definiti come segue

struct-o-union-specifier:
        struct-o-union identificatore opt {struct-dichiarazione-list}

Quindi per riferirsi a questo identificatore di struttura è necessario usare il suo nome.

Si può dichiarare le variabili come segue

struct node 
{ 
    int data; 
    struct node *next; 
} Node; 

Qui Node è un oggetto di tipo struct node. A sua volta, struct node è un identificatore di tipo della variabile Node.

È possibile omettere l'identificatore in un identificatore di struttura. In questo caso la struttura si chiama struttura senza nome. Tuttavia, usando una tale struttura non è possibile fare riferimento ad essa stessa all'interno della sua definizione. Ad esempio, non è possibile scrivere

struct 
{ 
    int data; 
    struct *next; 
    ^^^^^^^^^^^^^ 
} Node; 

perché è sconosciuto quale struttura viene indicata qui.

È possibile utilizzare strutture senza nome come membri di altre strutture. In questo caso, una struttura di questo tipo è denominata struttura anonimo ei suoi membri diventano membri della struttura che lo ospita.

Ad esempio

struct A 
{ 
    struct 
    { 
     int x; 
     int y; 
    ]; 
    int z; 
}; 

Questa struttura A ha tre membri x, y e z.

Quando viene utilizzato lo specificatore della classe di archiviazione, il dichiaratore è un identificatore che deve essere un nome typedef che indica il tipo specificato per l'identificatore.

Così in questo dichiarazione

typedef struct node 
{ 
    int data; 
    struct node *next; 
} Node; 

Node non è già un oggetto. È un nome di tipo che indica il nodo struct.

Quindi, da ora è possibile utilizzare il tipo nome Node invece del tipo specificatore struct node