C语言每次运行程序将文件中的数据读入链表中出错?

我的代码;编译通过了,但是每次跑到这里程序就自己退出了。
//每一次程序开始运行时读入文件中已经有的数据到链表
Node* head=NULL;

if(fgetc(fp)!=EOF){
head=(Node*)malloc(sizeof(Node));
fscanf(fp,"%lld%s%s%d%s%s%s",&head->stu_num,head->name,head->grade,&head->stu_class,head->major,head->date,head->palce);
head->next=NULL;
}

Node* p;
head->next=p;
while(fgetc(fp)!=EOF){
p=(Node*)malloc(sizeof(Node));
fscanf(fp,"%lld%s%s%d%s%s%s",&p->stu_num,p->name,p->grade,&p->stu_class,p->major,p->date,p->palce);
p=p->next;
}

感谢解答

你这个链表在while循环体里面被误操作断掉了吧:
Node * p;//p此时是野指针
head->next=p;//head的next域被无效的指针值覆盖
while(fgetc(fp)!=EOF){
p=(Node*)malloc(sizeof(Node));//没问题
fscanf();//没问题
p=p->next;//p是通过malloc()返回的新节点,但节点中的next域没有来得及进行赋值,可以认为是野指针。p=p->next之后,这个节点已经无法被访问了,然后循环继续执行,所有的节点next指针域都无法连接在一起,也无法通过head头结点访问整个链表
}

要看你的链表是头插法还是尾插法,新节点是插入到链表头部还是插入到链表尾部。
#if 0//如果你的链表是逆序插入方式,可以只用一个指针变量
Node * p;//p此时是野指针
while(fgetc(fp)!=EOF){
p=(Node*)malloc(sizeof(Node));
fscanf();
p->next=head->next;//逆序插入方式下,head的next域始终指向链表末尾,先把这个值保存给新节点的next域
head->next=p;//用p覆盖掉head节点原来的next指针域,继续循环即可
}
#else//正序插入,需要两个指针变量配合
Node * p;
p=head;//head保持不变,用p和p->pnext来操作
while(fgetc(fp)!=EOF){
p->next=(Node *)malloc(sizeof(Node));//本质就是把malloc()返回的新节点地址记入当前节点的next域
//也可以在进入循环之前专门再声明一个q指针变量,然后在循环里面q=malloc();
//然后p->next=q;把q填入p的next域
//p=q;把p指向q
//fscanf()操作p指针所指向的对象
//}循环结束花括号

p=p->pnext;//移动指针p指向新节点
fscanf();//操作新节点的数据域
}
#endif//
温馨提示:答案为网友推荐,仅供参考
相似回答