隐式声明错误链表 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(&current_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(&current_node, data);

我觉得我在指针以及如何使用它们方面缺乏知识,你能推荐任何在线免费资源吗(我是一个自我想法(。

编译器从上到下读取代码。在使用它之前,它必须看到名称的声明,否则它将为其采用隐式类型。在这里,您使用(调用(函数link_node在第 42 行,但该函数在第 44 行定义和声明。因此,编译器在第 42 行时不知道即将发布的声明,为其假定隐式类型,然后在第 44 行警告假设与实际类型不匹配。

只需在使用它的第一个位置上方的某个位置声明该函数,使用:

void link_node(list *current_node, int data);

编辑:至于你的第二个问题,你传递的list参数的类型是list *,即指向列表的指针。当你typedefedlist作为struct node *时,你通过混淆指针来搬起石头砸自己的脚,所以当list *current_node看起来像一个指向列表的指针时,它实际上是一个指向节点的指针,即两个级别的间接。

传递&current_node在技术上可以修复错误,但它不会做你想要的(因为link_node可以修改你的局部变量current_node,这不会修改列表本身(。解决方案是使用list *current_node作为局部变量,这样您就不会丢失间接级别。

但是,看起来您的link_node函数无论如何都已损坏,并且当前不需要指向指针的指针,因此您可以将参数的类型更改为仅list,并且仅设置该节点的next链接。(但这样做意味着它不能链接到空列表,所以你需要一个始终存在的哨兵节点,或者重新考虑整个功能。但请记住,它目前已损坏...

在您的append()方法中,尝试将list current_node = (*head);替换为list *current_node = head;。它应该可以解决问题。

相关内容

  • 没有找到相关文章

最新更新