使用typedef的链接列表

时间:2017-03-05 17:15:11

标签: c gcc data-structures linked-list typedef

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
    int value;
    struct node* next;
} node;

void print(node* list);

int main()
{
    node* n1;
    node* n2;
    n1 = (node *) malloc(sizeof(node));
    n2 = (node *) malloc(sizeof(node));

    n1->value = 4;
    n1->next = n2;
    n2->value = 5;
    n2->next = NULL;

    print(n1);
    return 0;
}

void print(node* list)
{
    node* p;
    p = list;
    while (p != NULL)
    {
        printf("%d ", p->value);
        p = p->next;
    }
}

代码有效但我的编译器(gcc)发出警告,n1-&gt; next = n2是(从不兼容的指针类型分配) 这是什么意思?我该如何避免呢?

1 个答案:

答案 0 :(得分:1)

config_ipython声明typedef struct {...} nodenode 的类型别名,没有标记。在C中,具有不同标签的两个相同的struct不是相同的结构。 (此外,没有标签的struct s的两个声明是不同的struct s。)声明根本不声明struct。因此,struct node指的是不同的,不完整的struct node* next;。 (它不完整,因为你只用它作为指针。)

这是一种更好的方法。 (将struct更改为node只是我的风格;当类型名称很容易与变量名称区分时,我发现它更容易。)请注意typedef的预先声明,它允许在后面的struct定义中使用它。 (当它在定义中使用时仍然不完整,但是因为它是一个指针,所以没关系。)

我还更改了Node调用以使用所定义变量的类型而不是typename,这通常是更好的样式。 (我删除了不必要的演员表;如果你打算使用C ++,你应该将malloc更改为malloc,而不是添加C风格的演员表。)

new

(住在coliru