¿Definición de estructura autoreferencial?
No he estado escribiendo C por mucho tiempo, por lo que no estoy seguro de cómo debo hacer este tipo de cosas recursivas... Me gustaría que cada celda contenga otra celda, pero aparece un error en el Las líneas del "campo 'niño' tienen un tipo incompleto". ¿Qué pasa?
typedef struct Cell {
int isParent;
Cell child;
} Cell;
Claramente, un Cell
no puede contener a otro Cell
, ya que se convierte en una recursión interminable.
Sin embargo, un Cell
CAN contiene un puntero a otro Cell
.
typedef struct Cell {
bool isParent;
struct Cell* child;
} Cell;
En C, no puedes hacer referencia al typedef que estás creando dentro de la estructura misma. Debe utilizar el nombre de la estructura, como en el siguiente programa de prueba:
#include <stdio.h>
#include <stdlib.h>
typedef struct Cell {
int cellSeq;
struct Cell* next; /* 'tCell *next' will not work here */
} tCell;
int main(void) {
int i;
tCell *curr;
tCell *first;
tCell *last;
/* Construct linked list, 100 down to 80. */
first = malloc (sizeof (tCell));
last = first;
first->cellSeq = 100;
first->next = NULL;
for (i = 0; i < 20; i++) {
curr = malloc (sizeof (tCell));
curr->cellSeq = last->cellSeq - 1;
curr->next = NULL;
last->next = curr;
last = curr;
}
/* Walk the list, printing sequence numbers. */
curr = first;
while (curr != NULL) {
printf ("Sequence = %d\n", curr->cellSeq);
curr = curr->next;
}
return 0;
}
Aunque probablemente sea mucho más complicado que esto en el estándar, puedes pensar en ello como si el compilador lo supiera struct Cell
en la primera línea typedef
pero no lo supiera tCell
hasta la última línea :-) Así es como recuerdo esa regla.
Desde el punto de vista teórico, las lenguas sólo pueden soportar estructuras autorreferenciales, no estructuras autoinclusivas.