C中链表的错误遍历列表

Error Traverse List of LinkedList in C

我编写了以下代码,但是当我尝试编译代码时,编译器显示以下错误。我的错在哪里?

编译器错误:

main.c:32:39: error: dereferencing pointer to incomplete type a€?struct Informationa€?
printf("Information : %d\
", ptr->_number);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <stdio.h>
#include <stdlib.h>

typedef struct Informaion{
    int _number;
    struct Informaion *next;
} Information;

int main(int argc, char const *argv[]){

    Information *temp;
    Information *head;

    temp = malloc(sizeof(Information));
    temp->_number = 20;
    head = temp;

    temp = malloc(sizeof(Information));
    temp->_number = 21;
    head->next = temp;

    temp = malloc(sizeof(Information));
    temp->_number = 22;
    head->next->next = temp;

    temp = malloc(sizeof(Information));
    temp->_number = 23;
    head->next->next->next = NULL;

    struct Information *ptr = head;
    while(ptr != NULL) {
      printf("Information : %d\
"
, ptr->_number);
      ptr = ptr->next;
   }

    free(head);
    free(temp);
    return 0;
}


你的类型的名字是struct Informaion。在您使用

的行中

1
struct Information *ptr = head;

为了解决这个问题,你可以修正错字,或者你可以直接通过 typedef 使用它。

1
Information *ptr = head;

作为一般惯例,您不应使用以下划线开头的变量或任何标识符。这些是为编译器保留的。建议你把 _number 改成别的。


结构定义有错别字

1
2
3
4
5
typedef struct Informaion{
                     ^^^  
    int _number;
    struct Informaion *next;
} Information;

所以要么在声明中的任何地方使用类型说明符struct InformaionInformation

此代码片段

1
2
3
temp = malloc(sizeof(Information));
temp->_number = 23;
head->next->next->next = NULL;

没有意义。其地址存储在指针 temp 中的已分配对象未添加到列表中。

应该写成

1
2
3
4
temp = malloc(sizeof(Information));
temp->_number = 23;
head->next->next->next = temp;
head->next->next->next->next = NULL;

要释放分配的节点,你应该写

1
2
3
4
for ( Information *ptr = head; head != NULL; ptr = head) {
  head = head->next;
  free( ptr );
}

换行:

1
struct Information *ptr = head;

到:

1
struct Informaion *ptr = head;  //no t

或 :

1
Information *ptr = head;

并且错误将消失。您可以定义的类型可以使用 struct InformaionInformation 命名,因为您已经对其进行了 typedef 编辑。

请注意,不鼓励使用以下划线开头的变量(例如您的 _number 变量),因为编译器会使用这些名称。