¿Definición de estructura autoreferencial?

Resuelto Ziggy asked hace 15 años • 9 respuestas

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;
Ziggy avatar Feb 26 '09 07:02 Ziggy
Aceptado

Claramente, un Cellno puede contener a otro Cell, ya que se convierte en una recursión interminable.

Sin embargo, un CellCAN contiene un puntero a otro Cell.

typedef struct Cell {
  bool isParent;
  struct Cell* child;
} Cell;
Andrew Grant avatar Feb 26 '2009 00:02 Andrew Grant

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 Cellen la primera línea typedefpero no lo supiera tCellhasta la última línea :-) Así es como recuerdo esa regla.

paxdiablo avatar Feb 26 '2009 01:02 paxdiablo

Desde el punto de vista teórico, las lenguas sólo pueden soportar estructuras autorreferenciales, no estructuras autoinclusivas.

Sundar avatar Jul 29 '2009 19:07 Sundar