我目前正在学习C,现在正在研究链接列表。我想我围绕着最基本的概念。现在我想打印这样的清单。我实现了自己的方法来打印列表的内容,但它们是半效率的。我找到了learn-c.org并喜欢他们做这么多的方法,但我似乎无法使用它。
他们的方法如下:
void print_list(node_t * head) {
node_t * current = head;
while (current != NULL) {
printf("%d\n", current->val);
current = current->next;
}
}
我创建了一个名为“head”的节点
node_t * head = malloc(sizeof(node_t));
尝试用“head”作为参数调用方法 - 显然 - 错误。意思是:print_list(head)
向我显示“冲突类型”错误。
有人对此有任何意见吗?我已经尝试过了,根据我的理解,该方法需要一个指向node_t结构的指针。
编辑:完整代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct node {
int val;
struct node * next;
} node_t;
int main(){
node_t * head = malloc(sizeof(node_t));
if (head == NULL) {
return 1;
}
head->val = 1;
head->next = NULL;
print_list(head);
}
void print_list(node_t * head) {
node_t * current = head;
while (current != NULL) {
printf("%d\n", current->val);
current = current->next;
}
}
答案 0 :(得分:3)
当你调用print_list
时,编译器不知道它是什么。在使用之前,您必须声明您使用的所有内容。
类似
// Declare the function prototype, so compiler knows about it
void print_list(node_t * head);
int main(void)
{
node_t * head;
// Create and populate list...
print_list(head);
return 0;
}
// Define the function implementation
void print_list(node_t * head)
{
// The implementation of the function...
}
答案 1 :(得分:1)
您没有声明原型:
...
typedef struct node {
int val;
struct node * next;
} node_t;
void print_list(node_t * head); // <<< add this
int main() {
...
在C中,即使没有声明它们也可以使用函数,然后编译器隐式地假定函数有任意数量的参数并且它返回一个int。这是非常古老的C标准的遗留物。如果你这样做,现代编译器通常会发出警告。
您的情况会发生什么:
print_list(head);
假设它返回int
void print_list(node_t * head) {
突然返回类型为nomore int
但是void
因此编译错误。