用链表指针键入错误?

时间:2014-11-28 05:57:44

标签: c pointers linked-list

好吧,这么长的故事。我遇到了多文件链表及其指针的问题...... 代码包括几个文件:prog10.h,createFile.c,main.c,release memory.c,以及我应该完成的代码片段,p10.c

文件如下

  1. prog10.h

    #include<stdio.h> 
    #include<stdlib.h> 
    typedef struct person
    {
       char name[20];
       int age; 
       struct person *next_ptr;
    } PERSON;
    
    PERSON* createList(void);
    void print_list(PERSON *head); 
    void release_memory(PERSON*);
    
  2. createFile.c

      #include "prog10.h"
      PERSON* createList()
      {
          char answer; 
          PERSON *current, *previous, *head = NULL;
          while(1) 
         {
            printf("Add a person to the list? [y/n] ");
            scanf("%c", &answer);
            if(answer == 'n') 
               return head; 
    
            current = (PERSON*)malloc(sizeof(PERSON)); 
    
            printf("Enter a Name: ");
            scanf("%s", current->name);
            printf("Enter person's age: "); 
            scanf("%i", &current->age);              
    
          }
      }
    
  3. 的main.c

    #include "prog10.h"
    int main(void)
    {
       PERSON *head = NULL;
       head = createList();
       print_list(head);
       release_memory(head); 
    
       printf("Done\n");
       return 0;
    }
    
  4. releaseMemory.c

    #include "prog10.h"
    void release_memory(PERSON *person *person_ptr)
    {
       PERSON *tmp_next_ptr;
       while(person_ptr != NULL)
       {
          tmp_next_ptr = person_ptr->next_ptr;
          free(person_ptr);
          person_ptr = tmp_next_ptr;
       }    
       puts("Memory Released");
    }        
    
  5. p10.c

    #include "prog10.h"
    void print_list(PERSON *person_ptr)
    {
       while(ptr != NULL)
       {
          printf("Name = %s\n", ptr->name);
          printf("Age = %i\n", ptr->age);
    
          ptr = ptr->next_ptr;
       }
    }
    
  6. 我知道对于一个比我更有经验的人来说,这似乎是显而易见的,但为什么这不会运行?请帮忙,我真的输了,需要弄清楚这个任务/决赛:b

2 个答案:

答案 0 :(得分:1)

好吧尽管有这个问题的问题,但在看完之后我觉得我应该将我的评论汇编成各种答案。所以这里......

我们从一个简单的开始。

Don't typecast the result of malloc

我认为你没有正确理解如何使用struct name和struct typedef作为数据类型。

如果您创建这样的结构:typedef struct person{...}PERSON;当您使用PERSON作为参数的类型,并且您需要结构指针时,您将这样做:func(PERSON *person_ptr)。 PERSON是这种情况下的类型,*表示我们需要一个指向此结构的指针,person_ptr是结构的名称。

警惕变量名称。

在一个函数中使用ptr,此变量既不是参数,也不是声明的局部变量或全局变量。您应该收到错误,表明尚未定义ptr。并注意你给变量的名字。当您命名变量时,请将其设为您可以查看的内容,并在没有注释的情况下理解其含义,或者在必要时提供注释,以便准确了解变量的含义。

您的createList没有做它想要做的事情。

在你的创建列表中,你实际上并没有创建一个列表,你只是创建一堆头节点并返回你创建的最后一个 NULL 。您必须记住创建节点时需要将它们附加到上一个节点的末尾(或者在前一个节点的前面,具体取决于您对列表的实现及其用途)。

当您在列表中创建节点时,请记住将它们链接在一起(并且不要忘记在此过程中丢失任何内容)。您最多可以创建 N 个节点,但由于您从未将它们与next_ptr

链接在一起,因此会丢失其中的每一个节点

这是答案的开始,但我不想为你重写代码,因为我觉得在学习抽象数据类型之类的东西时,试验和错误是有价值的。稍微处理代码,如果仍有问题,请编辑您的问题。如果你这样做,试着简明扼要。不要觉得需要发布代码的最后一部分。

答案 1 :(得分:0)

感谢所有帮助人员,事实证明,由于我的笔记中的错误,我没有看到,因为我(显然)是新的,答案比我想象的要简单得多。由于我的错误具有令人尴尬的明显性质,我不会发布更新,但事实上有人可能有一天会犯这个错误。所以不用多说了,这是p10.c的更新版本:

    #include "prog10.h" 
    void print_list(PERSON *person_ptr)
    {
       while(person_ptr != NULL
       {
          printf("Name: %s\n", person_ptr -> name);
          printf("Age: %i\n", person_ptr -> age);
          person_ptr = person_ptr -> nest_ptr);
       }
    }

再次感谢您的帮助,祝您有个美好的一天!