好吧,这么长的故事。我遇到了多文件链表及其指针的问题...... 代码包括几个文件:prog10.h,createFile.c,main.c,release memory.c,以及我应该完成的代码片段,p10.c
文件如下
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*);
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", ¤t->age);
}
}
的main.c
#include "prog10.h"
int main(void)
{
PERSON *head = NULL;
head = createList();
print_list(head);
release_memory(head);
printf("Done\n");
return 0;
}
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");
}
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;
}
}
我知道对于一个比我更有经验的人来说,这似乎是显而易见的,但为什么这不会运行?请帮忙,我真的输了,需要弄清楚这个任务/决赛:b
答案 0 :(得分:1)
好吧尽管有这个问题的问题,但在看完之后我觉得我应该将我的评论汇编成各种答案。所以这里......
Don't typecast the result of malloc
如果您创建这样的结构:typedef struct person{...}PERSON;
当您使用PERSON作为参数的类型,并且您需要结构指针时,您将这样做:func(PERSON *person_ptr)
。 PERSON是这种情况下的类型,*表示我们需要一个指向此结构的指针,person_ptr是结构的名称。
在一个函数中使用ptr,此变量既不是参数,也不是声明的局部变量或全局变量。您应该收到错误,表明尚未定义ptr。并注意你给变量的名字。当您命名变量时,请将其设为您可以查看的内容,并在没有注释的情况下理解其含义,或者在必要时提供注释,以便准确了解变量的含义。
在你的创建列表中,你实际上并没有创建一个列表,你只是创建一堆头节点并返回你创建的最后一个 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);
}
}
再次感谢您的帮助,祝您有个美好的一天!