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

我觉得自己对指针的知识和使用方法缺乏了解,你能推荐一些在线免费资源吗(我是自己想的)。

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

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

void link_node(list *current_node, int data);

编辑:至于你的第二个问题,你正在传递 list,其中参数的类型是 list *,即指向列表的指针。当您将 typedef 编辑 liststruct node * 时,您通过混淆指针开枪打自己的脚,所以当 list *current_node 看起来像指向列表的指针时,它实际上是指向节点指针的指针,即两个间接级别。

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

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

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