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;
}

  • 您的结构中有许多印刷错误。我不知道您要做什么,因为您没有说出来,但是如果您想打印地址,请使用 %p 而不是 %d
  • 我想显示我为结构设置的数据。我修复它。
  • @MikhailRazborov 如果您的问题得到解决,您可以接受一个答案。
  • 调用任何堆分配函数时:(malloc、calloc、realloc),始终检查(!=NULL)返回值以确保操作成功
  • 如果不使用 main() 的参数,则使用备用签名:int main( void )
  • 这个词有很多变化:信息(或者是信息)是拼写的,所以代码无法编译。注意:前导下划线为编译器”保留”。建议将 _number 重命名为 number
  • 对于对 malloc() 的每次调用,都必须使用从 malloc() 返回的相同指针调用 free()。实际上,代码有很多内存泄漏建议将 free(head); free(temp); 替换为: while( head) { ptr = head->next; free( head ); head = ptr; }
  • 行:head->next->next->next = NULL; 不正确最后一次调用 malloc() 的结果应存储不为 NULL。然后将最终的 next 字段设置为:head->next->next->next->next = NULL;。顺便说一句:将 ->next 字段串在一起不是一个好主意,当有很多 struct Informaion 的链接实例时,它不会扩展。建议使用 for() 循环,跟踪先前链接的条目并使用它链接下一个条目。此外,通常最好在链接之前初始化新条目的所有字段


你的类型的名字是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 Informaion 或Information。

此代码片段

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 Informaion 或 Information 命名,因为您已经对其进行了 typedef 编辑。

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


来源:https://www.codenong.com/43979062/

微信公众号
手机浏览(小程序)

Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_9717.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
0
分享到:
没有账号? 忘记密码?