如何在C中传递函数中的列表
我是新来的,我需要一些帮助。我想学习如何将如何在C中传递函数中的列表,c,C,我是新来的,我需要一些帮助。我想学习如何将NULL列表传递给函数,填充它,然后将其返回给我的主函数。 例如: #include <cstdio> typedef struct empNode { char amka[12]; char first_name[30]; char last_name[30]; int year; //etos proslhpshs float salary; int num_of_children
NULL
列表传递给函数,填充它,然后将其返回给我的主函数。
例如:
#include <cstdio>
typedef struct empNode {
char amka[12];
char first_name[30];
char last_name[30];
int year; //etos proslhpshs
float salary;
int num_of_children;
Child *children;
struct empNode *next;
} empNode;
void load_employees_from_file(empNode **employees);
//===========================================================
int main(void) {
empNode *employees = NULL;
load_employees_from_file(&employees);
while (employees != NULL) {
printf("%s ", employees->amka);
employees = employees->next;
}
}
//===========================================================
void load_employees_from_file(empNode **employees) {
FILE * fp;
int num_of_employees;
int i;
fp = fopen("employees.txt", "r");
if (fp == NULL) {
printf("Something went wrong, try again.\n");
return;
}
// here we read the first line of file to see how employee we have
fscanf(fp, "%d ", &num_of_employees);
while (num_of_employees) {
*employees = (empNode*) malloc(sizeof (empNode));
fscanf(fp, "%s ", (*employees)->amka);
fscanf(fp, "%s ", (*employees)->first_name);
fscanf(fp, "%s ", (*employees)->last_name);
fscanf(fp, "%d ", &(*employees)->year);
fscanf(fp, "%f ", &(*employees)->salary);
fscanf(fp, "%d\n", &(*employees)->num_of_children);
if ((*employees)->num_of_children > 0) {
(*employees)->children = (Child*) malloc(((*employees)->num_of_children) * sizeof (Child));
for (i = 0; i < (*employees)->num_of_children; i++) {
fscanf(fp, "%s ", (*employees)->children[i].fname);
strcpy((*employees)->children[i].lname, (*employees)->last_name);
fscanf(fp, "%d\n", &(*employees)->children[i].year_of_birth);
}
}
(*employees)->next = (empNode*) malloc(sizeof (empNode));
*employees = (*employees)->next;
num_of_employees--;
}
fclose(fp);
}
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *next;
}node;
void read_int(node **nn);
int main(void)
{
node *nn=NULL;
read_int(&nn);
printf("%d", nn->data);
return 0;
}
void read_int(node **nn)
{
FILE *fp;
fp=fopen("test.txt", "r");
fscanf(fp, "%d", (*nn)->data);
fclose(fp);
}
这里也有同样的问题,更容易理解,test.txt文件只包含数字2。但是我不能在我的main中打印它。浏览一下您的代码,似乎有几个问题。您应该学习使用调试器,它可以让您在执行过程中逐行检查代码并观察实际行为 以下是一些显而易见的问题,我认为您应该关注:
while
循环退出时,您认为*employees
的价值是什么?具体来说,请考虑以下语句:*employees=(*employees)->next代码>
while(employees!=NULL)
就没有意义了)。在这种情况下,在哪里设置NULL
终止符值?您似乎从未在任何地方将next
字段设置为NULL
malloc
两次?您似乎分配了两个不同的内存块来表示同一个员工 (*employees)->next = (empNode*) malloc(sizeof (empNode));
*employees = (*employees)->next;
这意味着
*employees
(从main
指向employees
)将始终指向未初始化的empNode
结构。由于内存未初始化,next
指针将是垃圾。这肯定会引起一些问题。在您的函数中从\u文件(empNode**employees)无效加载\u employees\u
更改:
(*employees)->next = (empNode*) malloc(sizeof (empNode));
到
紧接着*employees
变为next
,而while
循环从动态分配内存的开始处开始:
*employees = (empNode*) malloc(sizeof (empNode));
然后就开始了
否则,如果这是最后一名员工,next
元素仍然是NULL
指针
这样,当到达最后一个
下一个元素(指向NULL
)时,main
的while
循环终止条件将为true
@Olaf-empNode
显然是一个链表结构(定义包含在上面的源代码中)。你应该澄清你的问题,包括你观察到的具体错误,并解释你不理解的错误。@DaoWen:这不会改变错误的措辞。这通常是一些基本概念错误的一个指标。指针不是一个_列表;但只是一个-指针。@Olaf-True,但使用您的注释来解释更准确的描述是“指向链接列表的空指针”,可能会更有帮助。(如果你认为他不知道正确的用词,请他再解释一遍有什么意义?@Olaf——一个你的轶事:我在小学有一个奇怪的老师。每次我问她我是否可以去洗手间,她都会问:“我不知道,你可以吗?”直到几年后,我才意识到她想让我说“可以”而不是“可以”。对她来说,向我解释“可以”和“可以”之间的区别要有效得多,而不是一遍遍地重复她讽刺的回答,希望我能自己弄明白。这行不通。在下一次迭代中更改*employees
不会更新上一次迭代中(*employees)->next
的值。好的,给我一点时间…:)@道文然后,(*employees)->next=NULL代码>应该在循环开始时传输,对吗?或者可能在循环结束后?有许多方法可以让您编写此代码以正确运行。我认为没有一个正确的答案-代码中仍然有一个大问题*employee
应设置为指向列表的头部(本质上是将指向整个列表的指针返回给调用函数)。正如现在所写的那样,*employee
在每次添加新节点时都会重置,因此最终存储的是最后一个元素。(这应该可以解释为什么main
中的循环没有给出预期的结果。)
*employees = (empNode*) malloc(sizeof (empNode));