Как определить структуру typedef, содержащую указатели на себя?

Я пишу LinkedList в C, ниже код представляет определение моего узла.

typedef struct { int value; struct Node* next; struct Node* prev; } Node; 

Я понимаю (или думаю, что я это делаю), что struct Node не такой же, как typedef struct Node . Конечно, мой код компилируется и работает, как предполагается, однако, я получаю много предупреждений при назначении next и prev (предупреждение: назначение из несовместимого типа указателя). Я предполагаю, что это связано с тем, как я определяю их в структуре узла. Я загрузил полный источник здесь

Итак, если это действительно проблема, как я должен определить next и prev внутри typedef struct Node ?

Я беспокоился, что это может быть репостью, но я не мог найти то, что искал. Благодарю.

Вам нужно сделать это в следующем порядке:

 typedef struct Node Node; struct Node { int value; Node *next; Node *prev; }; 

Это не делает именно то, что вы просили, но оно решает проблему и как это делается вообще. Я не думаю, что есть лучший способ.

Такой вид прямого декларирования имеет второе использование при скрытии данных. Если список был реализован в библиотеке, у вас может быть только typedef в публичном заголовке, а также такие функции, как:

 Node * list_new(void); Node * list_append(Node *head, Node *new_tail); size_t list_length(const Node *head); 

Таким образом, пользователи библиотеки не имеют легкого доступа к внутренним элементам вашей библиотеки, то есть к полям структуры Node .

Другим приемлемым способом и с наименьшим изменением кода OP является следующее:

 typedef struct NodeT { int value; struct NodeT * next; struct NodeT * prev; } Node; 

Обратите внимание на введение NodeT и его использование в next и prev NodeT до тех пор, пока не будет доступен Node .

  • Являются ли typedef и #define одинаковыми в c?
  • Как typedef работает для указателей функций
  • Непрозрачные C-структуры: как их объявить?
  • C ++ typedef интерпретация константных указателей
  • Есть ли эквивалент Java или методология для ключевого слова typedef в C ++?
  • Что такое перечисление typedef в Objective-C?
  • C ++ шаблон typedef
  • C typedef указателя на структуру
  • Что означает typedef с круглыми скобками типа «typedef int (f) (void)»? Это прототип функции?
  • Повторяющиеся typedefs - недопустимы в C, но действительны в C ++?
  • Разница между 'struct' и 'typedef struct' в C ++?
  • Давайте будем гением компьютера.