好吧,长话短说。 我在使用多文件链表及其指针时遇到问题...代码包括几个文件:prog10.h,createFile.c,main.c,release memory.c,以及我应该完成的代码片段p10.c
文件如下
-
进度10.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*);
-
创建文件.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); } }
-
主.c
#include "prog10.h" int main(void) { PERSON *head = NULL; head = createList(); print_list(head); release_memory(head); printf("Donen"); 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 = %sn", ptr->name); printf("Age = %in", ptr->age); ptr = ptr->next_ptr; } }
我知道对于比我更有经验的人来说,这似乎很明显,但为什么这不运行? 请帮忙,我真的很迷茫,需要弄清楚这个作业/决赛:b
好吧,尽管这个问题存在问题,但在浏览之后,我觉得我应该将我的评论汇编成某种答案。所以在这里...
我们将从一个简单的开始。
不要对 malloc 的结果进行类型转换
我认为您没有正确理解如何使用结构名称和结构类型定义作为数据类型。
如果你创建一个这样的结构:typedef struct person{...}PERSON;
当你使用 PERSON 作为参数的类型时,你想要一个结构指针,你将这样做:func(PERSON *person_ptr)
.在这种情况下,PERSON 是类型,* 表示我们想要指向此结构的指针,person_ptr 是结构的名称。
警惕变量名称。
您可以在一个函数中使用 ptr,其中此变量既不是参数,也不是声明的局部或全局变量。您应该在那里收到一个错误,指示尚未定义 ptr。并注意您为变量指定的名称。当你命名一个变量时,让它成为你可以只看和理解含义的东西,没有注释,或者如有必要,提供注释,以便精确地说明变量的用途。
您的 createList 不会执行其预期操作。
在创建列表中,您实际上并没有创建列表,您只是创建一堆头节点并返回您创建的最后一个NULL 节点。您必须记住,在创建节点时,您需要将它们附加到前一个节点的末尾(或前一个节点的前面,具体取决于列表的实现及其用途)。
在列表中创建节点时,请记住将它们链接在一起(并且不要忘记在此过程中不要丢失任何内容)。您最多创建了 N 个节点,但您丢失了其中的每一个,因为您从未将它们与next_ptr
链接在一起
这是答案的开始,但我不想仅仅因为我觉得在学习抽象数据类型之类的东西时反复试验是有价值的,所以我就为您重写代码。稍微处理一下代码,如果您仍然遇到问题,请编辑您的问题。如果你这样做,试着简明扼要地解决问题。不要觉得有必要发布你的代码的每一点。
谢谢你们所有的帮助,事实证明,由于我的笔记中的一个错误,我没有看到,因为我(显然)是新手,答案比我想象的要简单得多。由于我的错误令人尴尬地明显,我不会发布更新,但因为其他人有一天可能会犯这个错误。因此,事不宜迟,这里是 P10.c 的更新版本:
#include "prog10.h"
void print_list(PERSON *person_ptr)
{
while(person_ptr != NULL
{
printf("Name: %sn", person_ptr -> name);
printf("Age: %in", person_ptr -> age);
person_ptr = person_ptr -> nest_ptr);
}
}
再次感谢您的帮助,祝你有美好的一天!