如何在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
  • 我假设您希望此列表以NULL结尾(否则,主函数中的
    while(employees!=NULL)
    就没有意义了)。在这种情况下,在哪里设置
    NULL
    终止符值?您似乎从未在任何地方将
    next
    字段设置为
    NULL
  • 为什么在循环体中调用
    malloc
    两次?您似乎分配了两个不同的内存块来表示同一个员工
  • 我认为上面的#1是您的程序现在崩溃的原因。(但如果您修复了该问题,您的程序可能仍会因其他问题之一而崩溃。)

    现在,在循环的最后一次迭代中,您可以执行以下操作:

        (*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));