use*_*645 3 c arrays typedef linked-list
#include <stdio.h>
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;
}
Run Code Online (Sandbox Code Playgroud)
为什么在使用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]
Run Code Online (Sandbox Code Playgroud)
@metalhead说的是对的.实现相同结果的另一种可能更好的方法是
typedef struct _node
{
int data;
struct _node *next;
} node;
Run Code Online (Sandbox Code Playgroud)
在此定义之后,节点(没有下划线)可以简单地用作类型名称,例如int.
PS 的下划线是只是一个标准的惯例,而不是要求.只要您在两个匹配项中都替换,就可以使用任何名称代替_node.但是,在c中,这是一种规范和一种编码约定,可以帮助开发人员快速理解 _node 实际上指的是节点类型.