В коде
struct LinkNode
{
int data;
struct LinkNode* next; // Why there use `struct` type define LinkNode again?
};
Строка struct LinkNode* next;
не определяет новый тип. Он объявляет переменную-член next
(уже существующего) типа LinkNode
.
То, что вас сбило с толку, вероятно, это ключевое слово struct
, которое, как вы уже поняли, является необязательным в этот контекст. Причина, по которой вам разрешено ставить struct
здесь в первую очередь, - это наследие от C. C различает имена тегов и имена типов. Объявление формы struct Foo {};
в C вводит только имя тега Foo
, но не имя типа. Это означает, что для создания экземпляра объекта Foo
в C вам нужно будет написать struct Foo f;
с ключевым словом struct
, чтобы преобразовать имя тега в соответствующий тип.
Чтобы получить правильное имя типа в C, вам нужно будет использовать typedef: typedef struct Foo FooType;
, который затем позволит вам просто написать FooType f;
. Поскольку это различие между именами тегов и именами типов оказалось не очень полезным на практике, C ++ просто избавился от этого различия, позволив более простую нотацию объявления, с которой вы знакомы.