2013-06-08 31 views
6

questo è probabilmente molto semplice, ma come posso ottenere una struct x per essere in struct x in C? Così, per esempio:Struct X in Struct X?

typedef struct _Node { 
    Node node; 
} Node; 

Ho fatto qualche ricerca e provato ad utilizzare i puntatori, in questo modo:

typedef struct _Node { 
    struct Node *node; 
} Node; 

Anche se che lascia il nodo variabile come un puntatore, che io non voglio, voglio solo che sia un'istanza della struttura del nodo. Grazie per qualsiasi aiuto. :)

EDIT:

In sostanza quello che sto cercando di fare è:

Node current = createNode(...); 
while (true) { 
    Node node = createNode(..., &current); 
    addToList(node); 
    current = somethingElse(); 
} 

Come potete immaginare, io voglio un nodo regolare per entrare nel CreateNode function():

Node createNode(..., Node node) {} 
+14

Non puoi farlo. Per comprendere la ricorsione, devi prima capire la ricorsione. – DCoder

+0

@DCoder Quindi quale sarebbe il lavoro ideale in giro? –

+4

Usa puntatori, come quello che hai trovato nella tua ricerca –

risposta

3

Questo non è possibile. Perché questo rientra nel tipo incompleto. No struct Node all'interno di struct Node all'interno di struct Node ... e così via .... Ciò rende la struttura originale incompleta. Quindi definizione del tipo incompleta.

Il motivo è questo.

  1. Per un campo all'interno di una struttura, deve essere un tipo noto.
  2. Ma al momento in cui vediamo struct Node all'interno di struct Node{} non è stato ancora determinato.
  3. È determinato solo dopo la scansione di tutte le definizioni di struct Node{} ma ciò è possibile solo dopo aver individuato il tipo di struct Node all'interno del quale si ottiene un paradox.

Ma il caso è diverso se si include struct Node *.

  1. Quando si raggiunge struct Node *, si sa che è un tipo di puntatore. Ciò richiede una quantità fissa di storage indipendentemente dal tipo di puntatore.
  2. Quindi, esegue correttamente la scansione e termina la definizione di struct Node{}. Quindi è un tipo completo.
8
typedef struct node { 
    struct node node; 
} node_s; 

Ciò porterebbe ad un "ricorsione infinita". In altre parole, la sua dimensione sarebbe infinita. Il compilatore non può rispondere a questa domanda: quanta memoria allocare? Pertanto lanci un messaggio diagnostico.

Ecco perché è necessario utilizzare i puntatori per creare tipi autoreferenziali.

typedef struct node { 
    struct node *node; 
} node_s; 

A proposito, identificatori iniziando con un trattino basso seguito da un carattere di sottolineatura o lettera maiuscola sono riservati alla realizzazione.