无法将信息写入线性链表

时间:2013-07-05 02:02:05

标签: c linked-list

processFilefunction将文件中的信息正确扫描到p,但是addNodeLast函数不会将p中的信息添加到链表员工中,因为它会崩溃。
有人可以帮我修复崩溃,以便将每个节点链接在一起吗?

#include <stdio.h>
#include <stdlib.h>
#include "list.h"

void processFile(NODEPTR *employees, FILE *fp);
void outputPayFile(NODEPTR employees);

FILE *fp;

int main(void) {
    NODEPTR employees;

    if (fopen_s(&fp, "payfile2.txt", "r") != 0) {
            printf("Failed to open payfile.txt for reading\n");
            exit(0);
    }
    ...missing code...
}

void processFile(NODEPTR *employees, FILE *fp) {
    int i = 0;
    NODEPTR p;
    while(i < 5) {
            printf("Entered Loop\n");
            p = (NODEPTR) malloc(sizeof(node));

            fscanf(fp, "%s %s %c %d %c %f\n", p->firstName, p->lastName, &(p->gender),
                   &(p->tenure), &(p->rate), &(p->rate), &(p->salary));

            addNodeLast(employees, p);

            i++;
    }
}

在list.h中:

void addNodeLast(NODEPTR *list, NODEPTR t) {
    NODEPTR p;

    if (*list == NULL)
        *list = t;
    else {
        p = *list;
        while (p->next)
            p = p->next;
        p->next = t;
    }
}

NODEPTR的定义:

typedef struct node {
    char   firstName[11];
    char   lastName[16];
    char   gender;
    int    tenure;
    char   rate;
    float  salary;
    struct node *next;
} node, *NODEPTR;

1 个答案:

答案 0 :(得分:2)

您永远不会初始化next指针。这是一个常见的错误。对malloc的调用不会使你的记忆归零。因此,当您将节点添加到非空列表时,您可能会直接运行,因为第一个节点的next指针可能是非空的。

你至少需要这样做:

p = malloc(sizeof(node));
if( p != NULL ) p->next = NULL;

您可以考虑使用calloc,它为零:

p = calloc(1, sizeof(node));