] 为什么不能运行自定义load函数,调用保存的数据
程序代码:
// 实训4.cpp : 定义控制台应用程序的入口点。 // // 实训1.cpp : 定义控制台应用程序的入口点。 // // 实训2.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "stdlib.h" #include "string.h" struct STU { int xuehao; char name[30]; float daolun; float cyuyan; float english; float math; float sum; float avg; struct STU *next; }; struct STU * input (void); void list (struct STU * p); struct STU * save(struct STU *p); struct STU * load(struct STU *p); void clear_list(); void find(struct STU *p); void total(struct STU *p); struct STU *head,*tail=NULL; int n=0; struct STU *p=NULL;//p是头节点 struct STU *q=NULL;//保存文件地址 struct STU *a=NULL;//加载后文件地址 int _tmain(int argc, _TCHAR* argv[]) { while(1) { printf("Hello Worlf!\n"); printf("\n1:载入成绩"); printf("\n2:列出成绩"); printf("\n3:录入成绩"); printf("\n4:查询成绩"); printf("\n5:成绩统计"); printf("\n6:修改成绩"); printf("\n7:另存为成绩"); printf("\n8:加密成绩"); printf("\n9:排名次"); printf("\n0:退出"); int v; printf("请选择"); scanf("%d",&v); fflush(stdin); switch(v){ case 1: p=input(); break; case 2:list(p);break; case 3:q=save(p);break; case 4:a=load(q);break; case 5:find(p);break; case 6:total(p);break; } } return 0; } struct STU * input (void) { while(true) { printf("\n第%d位同学:",n+1); struct STU *p=(struct STU *)malloc(sizeof(struct STU ));//临时节点,每个同学就新建一个节点 p->next=NULL; printf("\n输入学号"); scanf("%f",&p->xuehao);//当输%d再输出%s,必须getchar();,不然直接跳过 getchar(); printf("\n输入姓名"); gets(p->name); printf("\n输入导论"); scanf("%f",&p->daolun); printf("\n输入c语言"); scanf("%f",&p->cyuyan); printf("\n输入英语"); scanf("%f",&p->english); printf("\n输入数学"); scanf("%f",&p->math); //加入链表中 if (head==NULL)//链表还是空的 { tail=head=p; } else//链表中已有信息 { tail->next=p; tail = p; } n++; getchar();//去掉缓存中的内容 char c; printf("\n\n还要输入吗(Y/N)"); scanf("%c", &c); if (c!='y' && c!='Y') break; getchar();//去掉缓存中的内容 } return p; } void list (struct STU * p) { p = head;//p指向链表头 //遍历链表中的每一个元素,并打印其信息 while (p!=NULL) { printf("\n输入学号%.0f",p->xuehao); printf("\t输入姓名%s\t",p->name); printf("\n输入导论%.1f",p->daolun); printf("\t输入c语言%.1f",p->cyuyan); printf("\t输入英语%.1f",p->english); printf("\t输入数学%.1f",p->math); p=p->next; } } struct STU * save(struct STU *p) {//保存 FILE* fs; fs=fopen("d:\\score.dat","wb"); fprintf(fs,"%d",n);//先保存人数到文件 p = head;//p指向链表头 //遍历链表中的每一个元素,分别把它们写入到文件中 while (p!=NULL) { //把p所指的结构体写入文件中 int len = sizeof(struct STU); fwrite(p, len ,1 , fs); //把p所指向的内存块(长为len)的1块存入fs指定的文件 p=p->next; } fclose(fs); return q; } struct STU *load(struct STU *q) {//载入 clear_list();//清除原有的链表中数据 FILE* fs; fs=fopen("c:\\score.dat","rb"); fscanf(fs,"%d",&n);//读入人数 //要逐个读入n个块的结构内容 for(int i=0; i<n;i++) { //分配一个结构空间,用来接收从文件读入的一个结构数据 struct STU*q = (struct STU*) malloc( sizeof(struct STU)); int len = sizeof(struct STU); fread(q,len,1,fs); fclose(fs); return a; } } void clear_list() { //清除所有的成绩 (从头开始清除) struct STU *p = head;//p指向链表头 while (p!=NULL) { head = head->next; free(p); p=head; } n=0; } void find(struct STU *p) {//删除一个同学的信息 char st_name[20]; printf("\n输入要查询同学的姓名:"); gets(st_name); p = head;//p指向链表头 struct STU *q=NULL;//指向上一个无素 //遍历链表中的元素,找到这同学的信息结构体(指针p指向它) while (p!=NULL) { //是不是要找的学生 if (strcmp(st_name, p->name)==0) { printf("\n输入学号%.0f",p->xuehao); printf("\t输入姓名%s\t",p->name); printf("\n输入导论%.1f",p->daolun); printf("\t输入c语言%.1f",p->cyuyan); printf("\t输入英语%.1f",p->english); printf("\t输入数学%.1f",p->math); //把找到的这个同学的结构体从链表中删除,并回收其内存 //if (q==NULL)//说明:p指向的结构体是头结构体 //{ // head=head->next;//把头指针指向新的头结构 // free(p); //} //else //{ // q->next=p->next; // free(p); //} break; } q=p; p=p->next; } } void total(struct STU *p) { p = head;//p指向链表头 //遍历链表中的每一个元素,并打印其信息 p->sum=0; while (p!=NULL) { p->sum+=p->math; p=p->next; } printf("%.1f",p->sum); }