我有这段关于 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);
我觉得我在指针以及如何使用它们方面缺乏知识,你能推荐任何在线免费资源吗(我是一个自我想法(。
编译器从上到下读取代码。在使用它之前,它必须看到名称的声明,否则它将为其采用隐式类型。在这里,您使用(调用(函数link_node
在第 42 行,但该函数在第 44 行定义和声明。因此,编译器在第 42 行时不知道即将发布的声明,为其假定隐式类型,然后在第 44 行警告假设与实际类型不匹配。
只需在使用它的第一个位置上方的某个位置声明该函数,使用:
void link_node(list *current_node, int data);
编辑:至于你的第二个问题,你传递的list
参数的类型是list *
,即指向列表的指针。当你typedef
edlist
作为struct node *
时,你通过混淆指针来搬起石头砸自己的脚,所以当list *current_node
看起来像一个指向列表的指针时,它实际上是一个指向节点的指针,即两个级别的间接。
传递¤t_node
在技术上可以修复错误,但它不会做你想要的(因为link_node
可以修改你的局部变量current_node
,这不会修改列表本身(。解决方案是使用list *current_node
作为局部变量,这样您就不会丢失间接级别。
但是,看起来您的link_node
函数无论如何都已损坏,并且当前不需要指向指针的指针,因此您可以将参数的类型更改为仅list
,并且仅设置该节点的next
链接。(但这样做意味着它不能链接到空列表,所以你需要一个始终存在的哨兵节点,或者重新考虑整个功能。但请记住,它目前已损坏...
在您的append()
方法中,尝试将list current_node = (*head);
替换为list *current_node = head;
。它应该可以解决问题。