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;
答案 0 :(得分:2)
您永远不会初始化next
指针。这是一个常见的错误。对malloc
的调用不会使你的记忆归零。因此,当您将节点添加到非空列表时,您可能会直接运行,因为第一个节点的next
指针可能是非空的。
你至少需要这样做:
p = malloc(sizeof(node));
if( p != NULL ) p->next = NULL;
您可以考虑使用calloc
,它为零:
p = calloc(1, sizeof(node));