Предупреждения при создании отдельного списка с массивами

#include  typedef struct { int data; struct node *next; }node; void print(node *head) { node *tmp = head; while (tmp) { printf ("%d ", tmp->data); tmp = tmp->next; } } int main() { node arr[5] = { {1, &arr[1]}, {2, &arr[2]}, {3, &arr[3]}, {4, &arr[4]}, {5, NULL} }; print(arr); return 0; } 

Почему я получаю эти предупреждения при компиляции с помощью gcc -Wall? (даже без -Wall, gcc производит те же предупреждения)

 list.c: In function 'print': list.c:15:7: warning: assignment from incompatible pointer type [enabled by default] list.c: In function 'main': list.c:22:18: warning: initialization from incompatible pointer type [enabled by default] list.c:22:18: warning: (near initialization for 'arr[0].next') [enabled by default] list.c:23:18: warning: initialization from incompatible pointer type [enabled by default] list.c:23:18: warning: (near initialization for 'arr[1].next') [enabled by default] list.c:24:18: warning: initialization from incompatible pointer type [enabled by default] list.c:24:18: warning: (near initialization for 'arr[2].next') [enabled by default] list.c:25:18: warning: initialization from incompatible pointer type [enabled by default] list.c:25:18: warning: (near initialization for 'arr[3].next') [enabled by default] 

Вы пытаетесь использовать struct node внутри определения node поэтому компилятор не знает, что вы имеете в виду, что это одно и то же. Попробуйте сначала объявить структуру:

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

То, что сказал @metalhead, было правильным. Другой, вероятно, лучший способ добиться такого же результата

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

После этого узла определения (без подчеркивания) можно просто использовать как имя типа, например, int.

PS Подчеркиваниеэто стандартное соглашение , а не требование. Любое имя могло использоваться вместо _node, если вы заменяете в обоих случаях. Однако в c это норма и вид соглашения о кодировании, который помогает разработчикам быстро понять, что _node относится к типу узла на самом деле .