链表编译错误

Linked list compiler error

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

typedef struct{
    int data;
    struct Node* next;
}Node;

Node* head;

void AddEntry(){
    int x;
    Node* temp;
    temp = head;
    while(temp != NULL){
        temp = temp->next;
    }
    Node* temp1 = (Node*)malloc(sizeof(Node));
    temp->next = temp1;
    printf("What is the value for this entry?\n");
    scanf("%d",&x);
    temp1->data = x;
    temp1->next = NULL;
}
void PrintList(){
    Node* temp;
}



int main(void){

}

当我编译此代码时出现编译器错误:

pointertest.c: In function ‘AddEntry’:

pointertest.c:16:8: warning: assignment from incompatible pointer type [enabled by default]
   temp = temp->next;
        ^
pointertest.c:19:13: warning: assignment from incompatible pointer type [enabled by default]
  temp->next = temp1;

我不明白这是为什么。我在我的教科书和其他地方看到过这样做。我以为它是将指针 temp 分配给保存在 temp next 中的地址。

感谢您的帮助

你的结构定义是假的。试试这个:

typedef struct tagNode {
  int data;
  struct tagNode *next;
} Node;

在您的代码中,没有 struct Node 这样的东西,只有一个带有 "alias" (typedef) 的未命名结构称为 Node

通过这样定义,您可以通过以下任一方式声明此类型的变量:

struct tagNode foo;

或者:

Node foo;

但是当我 typedef 这样 struct 时,我避免使用标签以避免混淆。

有人在评论中提出,我选择使用 struct tagNode 而不是 struct Node 的原因可能令人困惑。两者都同样有效,但我个人的偏好是使用不同的名称以避免以后混淆。我发现如果我刚刚使用 struct Node.

,那么从 Node *foo 中直观地消除歧义会更容易

您的代码中没有struct Node

这是一个typedef匿名结构

typedef struct {
    int data;
    struct Node* next;
} Node;

在c中是有效的,但是到这里根本没有声明struct Node,你需要

typedef struct Node {
    int data;
    struct Node* next;
} Node;

如果你无论如何都要typedef,你也可以这样做

typedef struct Node Node;
struct Node
 {
    int   data;
    Node *next;
 };