隐式声明错误链表 C
implicit declaration error linked lists C
我有一段关于 C 中链表的代码;我收到了先前的隐式声明错误和一些警告。
void append(list *head, int data)
{
list current_node = (*head);
while(current_node->next!=NULL)current_node = current_node->next;
link_node(current_node, data);
}
void link_node(list *current_node, int data)
{
list new_node = create_node();
new_node->data = data;
new_node->next = NULL;
(*current_node)->next = new_node;
*current_node = new_node;
}
我收到的错误消息是:
tp3.c: In function ‘append’:
tp3.c:42:2: warning: implicit declaration of function ‘link_node’ [-Wimplicit-function-declaration]
link_node(¤t_node, data);
^
tp3.c: At top level:
tp3.c:44:6: warning: conflicting types for ‘link_node’
void link_node(list *current_node, int data)
^
tp3.c:42:2: note: previous implicit declaration of ‘link_node’ was here
link_node(¤t_node, data);
我觉得自己对指针的知识和使用方法缺乏了解,你能推荐一些在线免费资源吗(我是自己想的)。
编译器从上到下读取代码。它必须在你使用它之前看到名称的声明,否则它会为它假定一个隐式类型。在这里,您在第 42 行使用(调用)函数 link_node
,但该函数是在第 44 行定义和声明的。因此编译器在第 42 行不知道即将到来的声明,假定为隐式类型对于它,然后在第 44 行警告假设与实际类型不匹配。
只需在您使用它的第一个位置上方的某处声明该函数,其中:
void link_node(list *current_node, int data);
编辑:至于你的第二个问题,你正在传递 list
,其中参数的类型是 list *
,即指向列表的指针。当您将 typedef
编辑 list
为 struct node *
时,您通过混淆指针开枪打自己的脚,所以当 list *current_node
看起来像指向列表的指针时,它实际上是指向节点指针的指针,即两个间接级别。
传递 ¤t_node
技术上会修复错误,但它不会做你想做的事(因为 link_node
然后可以修改你的局部变量 current_node
,这不会修改列表本身)。解决方案是使用 list *current_node
作为您的局部变量,这样您就不会失去间接级别。
但是,看起来你的 link_node
函数无论如何都坏了,而且目前不需要指向指针的指针,所以你可以将参数的类型更改为只是 list
并且只设置该节点的 next
link 。 (但这样做意味着它不能 link 到一个空列表,所以你需要一个始终存在的哨兵节点,或者重新考虑整个功能。但请记住它目前已损坏......)
在您的 append()
方法中尝试将 list current_node = (*head);
替换为 list *current_node = head;
。它应该可以解决问题。
我有一段关于 C 中链表的代码;我收到了先前的隐式声明错误和一些警告。
void append(list *head, int data)
{
list current_node = (*head);
while(current_node->next!=NULL)current_node = current_node->next;
link_node(current_node, data);
}
void link_node(list *current_node, int data)
{
list new_node = create_node();
new_node->data = data;
new_node->next = NULL;
(*current_node)->next = new_node;
*current_node = new_node;
}
我收到的错误消息是:
tp3.c: In function ‘append’:
tp3.c:42:2: warning: implicit declaration of function ‘link_node’ [-Wimplicit-function-declaration]
link_node(¤t_node, data);
^
tp3.c: At top level:
tp3.c:44:6: warning: conflicting types for ‘link_node’
void link_node(list *current_node, int data)
^
tp3.c:42:2: note: previous implicit declaration of ‘link_node’ was here
link_node(¤t_node, data);
我觉得自己对指针的知识和使用方法缺乏了解,你能推荐一些在线免费资源吗(我是自己想的)。
编译器从上到下读取代码。它必须在你使用它之前看到名称的声明,否则它会为它假定一个隐式类型。在这里,您在第 42 行使用(调用)函数 link_node
,但该函数是在第 44 行定义和声明的。因此编译器在第 42 行不知道即将到来的声明,假定为隐式类型对于它,然后在第 44 行警告假设与实际类型不匹配。
只需在您使用它的第一个位置上方的某处声明该函数,其中:
void link_node(list *current_node, int data);
编辑:至于你的第二个问题,你正在传递 list
,其中参数的类型是 list *
,即指向列表的指针。当您将 typedef
编辑 list
为 struct node *
时,您通过混淆指针开枪打自己的脚,所以当 list *current_node
看起来像指向列表的指针时,它实际上是指向节点指针的指针,即两个间接级别。
传递 ¤t_node
技术上会修复错误,但它不会做你想做的事(因为 link_node
然后可以修改你的局部变量 current_node
,这不会修改列表本身)。解决方案是使用 list *current_node
作为您的局部变量,这样您就不会失去间接级别。
但是,看起来你的 link_node
函数无论如何都坏了,而且目前不需要指向指针的指针,所以你可以将参数的类型更改为只是 list
并且只设置该节点的 next
link 。 (但这样做意味着它不能 link 到一个空列表,所以你需要一个始终存在的哨兵节点,或者重新考虑整个功能。但请记住它目前已损坏......)
在您的 append()
方法中尝试将 list current_node = (*head);
替换为 list *current_node = head;
。它应该可以解决问题。