在C中打印链接列表

时间:2016-09-14 09:42:48

标签: c pointers

我目前正在学习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;
    }
}

2 个答案:

答案 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因此编译错误。