Следующий элемент структуры, неполный тип

struct node{ struct node next; int id; } 

дает следующее поле, имеет ошибку неполного типа “.

что не так с этой структурой?

При создании самореферентного типа данных вам нужно использовать указатели для решения проблем округлости:

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

… должен работать, но заботиться о том, чтобы правильно распределять память при ее использовании.

Почему указатель? Рассмотрим это: точка определения struct такова, что компилятор может определить, сколько памяти выделяется и какие части доступа, когда вы говорите node.id Если ваша структура node содержит другую структуру node , сколько памяти должен выделяться компилятору для данного node ?

Используя указатель, вы обходите это, потому что компилятор знает, сколько места выделяется для указателя.

Если структура может содержать другой экземпляр своего типа, его размер будет бесконечным.

Вот почему он может содержать только указатель на свой собственный тип.

Кроме того, в этот момент кода размер структуры неизвестен, поэтому компилятор не мог знать, сколько места зарезервировать для него.

  1. Вам нужно выполнить форвардную декларацию узла, поскольку компилятор еще не знает node пока он обрабатывает его определение.
  2. Вероятно, вы хотели сохранить указатель, а не сам узел.

Попробуй это:

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

Некоторые виды использования неполных типов плохо сформированы, например, когда вы пытаетесь объявить объект неполного типа. Однако вы можете объявить указатель на неполный тип (например). В этом случае это именно то, что нужно здесь:

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

Проблема заключается в том, когда компилятор достигает этой строки:

 struct node{ struct node next; /* << this line */ 

компилятор фактически не знает, что такое struct node , потому что вы определяете struct node .

В общем, вы не можете использовать тип, который не определен или не является неполным.

Чтобы работать, вы должны написать:

 typedef struct _node{ struct _node* next; int id; }node;