如何在C中的函数中传递列表

时间:2015-12-13 18:36:33

标签: c

我是新来的,我需要一些帮助。我想学习如何将NULL列表传递给函数填充它然后将其返回到我的main函数。 FOR INSTANCE:

#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);
}

我在while函数中运行main时遇到错误,更具体地说,我的程序崩溃了。

-------------------------------------------- ----------------------- 好吧让mu把它说得更清楚,经过更正我没有问题我的功能列表中的问题是我的列表无法转移到我的主要功能。 这是一个明显的例子:

#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.但我不能在我的主文件中打印。

2 个答案:

答案 0 :(得分:2)

浏览代码,似乎有几个问题。您应该学会使用调试器,它可以让您在执行期间逐行执行代码并观察实际行为。

以下是我认为你应该看到的一些明显问题:

  1. *employees循环退出时,您认为while的价值是什么?具体来说,请考虑以下声明:*employees = (*employees)->next;
  2. 我假设您希望此列表以NULL结尾(否则,主函数中的while (employees != NULL)将没有意义)。在这种情况下,您在哪里设置NULL终止符值?您似乎无法将next字段设置为NULL ...
  3. 为什么要在循环体中调用malloc两次?您似乎正在分配两个不同的内存块来代表同一个员工。
  4. 我认为上面的#1是你的程序现在崩溃的原因。 (但是如果你解决了这个问题,你的程序可能会因其他问题之一而崩溃。)

    现在,在循环的最后一次迭代中,你会这样做:

        (*employees)->next = (empNode*) malloc(sizeof (empNode));
        *employees = (*employees)->next;
    

    这意味着*employees(指向employees的{​​{1}})将始终指向未初始化的main结构。由于内存未初始化,empNode指针将是垃圾。这肯定会引起一些问题。

答案 1 :(得分:2)

在您的函数void load_employees_from_file(empNode **employees)

更改:

(*employees)->next = (empNode*) malloc(sizeof (empNode));

(*employees)->next = NULL;

紧接着*employees变为next并且while循环从动态分配内存的开头开始:

*employees = (empNode*) malloc(sizeof (empNode));

然后填充。

否则,如果这是最后一名员工,则next元素仍为NULL指针。

这样,当main元素(指向while}时,true next循环终止条件为NULL ) 到达了。