大哥帮解释一下

yi19861209 2017-07-22 09:31:10
#include<stdio.h>
#include<stdlib.h>
#define XIN sizeof(struct student)
typedef struct student{
int number;
char name[4];
int score1;
int score2;
int score3;
float average;
struct student *node;
}xin;
int main(){
FILE *fp;
xin *p1,*p2,*p3,*head,m;
int i=0;
head=NULL;
if((fp=fopen("stud","r"))==NULL){
printf("无法打开此文件");
exit(0);
}
p1=p2=(xin *)malloc(XIN);
fscanf(fp,"%d %s %d %d %d %f\n",&p1->number,p1->name,&p1->score1,&p1->score2,&p1->score3,&p1->average);
while(!feof(fp)){
if(i==0)head=p1;
else p2->node=p1;
p2=p1;
p1=(xin*)malloc(XIN);
i++;
fscanf(fp,"%d %s %d %d %d %f\n",&p1->number,p1->name,&p1->score1,&p1->score2,&p1->score3,&p1->average);
}
p2->node=p1;
p1->node=NULL;
fclose(fp);
p2=&m;
p2->node=head;
while(i+1!=0){
for(p1=head;p1->node!=NULL;){
if(p1->average<p1->node->average){
p3=p1->node->node;
p2->node=p1->node;
p2->node->node=p1;
p1->node=p3;
if(p2==&m)head=p2->node;
p1=p2->node;
}
p2=p1; //为什么这"p2=p2->node"就段错误,这两个不是一样的吗。
p1=p1->node;
}
i--;
}
if((fp=fopen("stu_sort","w"))==NULL){
printf("无法打开此文件");
exit(0);
}
p3=head;
while(p3!=NULL){
fprintf(fp,"%d %s %d %d %d %6.2f\n",p3->number,p3->name,p3->score1,p3->score2,p3->score3,p3->average);
p3=p3->node;
}
fclose(fp);
return 0;
}
...全文
230 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-07-24
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
战在春秋 2017-07-24
  • 打赏
  • 举报
回复
引用
p2=p1; //为什么这"p2=p2->node"就段错误,这两个不是一样的吗。
p1=p2->node; //注意这行是在if分支中,有可能执行,也有可能不执行,取决于是否满足判断条件

//所以这两个并不一样 
p2 = p1;  //因为不能百分百保证 p1 = p2->node会执行
p2 = p2->node;
ztenv 2017-07-23
  • 打赏
  • 举报
回复
这有什么好解释的?

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧