C中LinkedList的错误遍历列表

时间:2017-05-15 12:03:47

标签: c compiler-errors singly-linked-list dereference

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

编译器错误:

  

main.c:32:39:错误:解除引用指向不完整类型'struct Information'的指针          printf(“信息:%d \ n”,ptr-> _number);

#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\n", ptr->_number);
      ptr = ptr->next;
   }

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

3 个答案:

答案 0 :(得分:3)

您的类型名称为struct Informaion。在您正在使用的行中

struct Information *ptr = head;

要解决此问题,您可以修复拼写错误,也可以直接使用typedef。

Information *ptr = head;

作为一般做法,您不应使用以下划线开头的变量或任何标识符。这些是为编译器保留的。建议您将_number更改为其他内容。

答案 1 :(得分:2)

结构定义中存在拼写错误

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

因此,请在声明中使用下面的任何地方使用类型说明符struct InformaionInformation

此代码段

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

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

编写

是正确的
temp = malloc(sizeof(Information));
temp->_number = 23;
head->next->next->next = temp;
head->next->next->next->next = NULL;

要释放已分配的节点,您应该编写

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

答案 2 :(得分:0)

更改行:

struct Information *ptr = head;

到:

struct Informaion *ptr = head;  //no t 

或:

Information *ptr = head;

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

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