求救高手,我这程序就是执行其中一个功能老是出错,能不能指正一下
执行功能5老是出错,请高手帮忙指正一下#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
#define LEN sizeof(struct student)
char schoolwork[5][10]={"math","c_prog","eng","polity","sport"};
struct student /* 学生的数据结构 */
{
char class_0[20];
int num;
char name[8];
float score[5];
float total;
float ave;
struct student *next;
int order;
}stu;
int n,i;
/* 函数功能:创建链表,完成数据录入功能 */
struct student *create(void)
{
struct student *p1,*p2,*head;
n=0;
p1=p2=(struct student *)malloc(LEN);
printf("input number of student:");
printf("if number is 0,stop inputing.\n");
scanf("%d",&p1->num);
printf("class:");
scanf("%s",p1->class_0);
printf("name:");
scanf("%s",p1->name);
printf("score:");
for(i=0;i<5;i++)
{
printf("%s:",schoolwork[i]);
scanf("%f",&p1->score[i]);
}
head=NULL;
while(p1->num!=0)
{
n=n+1;
if(n==1)
head=p1;
else
p2->next=p1;
p2=p1;
p1=(struct student *)malloc(LEN);
printf("input number of student:");
printf("if number is 0,stop inputing.\n");
scanf("%d",&p1->num);
if(p1->num==0)
goto end;
printf("class:");
scanf("%s",p1->class_0);
printf("name:");
scanf("%s",p1->name);
printf("score:");
for(i=0;i<5;i++)
{
printf("%s:",schoolwork[i]);
scanf("%f",&p1->score[i]);
}
}
end:
p2->next=NULL;
return(head);
}
/* 函数功能:计算每个学生的5门功课的总成绩和平均成绩 */
void TotalScore(struct student *head)
{
struct student *p1;
p1=head;
while (p1!= NULL) /*若不是表尾,则循环*/
{
p1->total=0;
for (i=0;i<5;i++)
{
p1->total+=p1->score[i];
}
p1->ave=p1->total/5;
p1=p1->next; /*让p指向下一个节点*/
}
}
/*函数功能:交换两个整型数*/
void IntSwap(int *pt1, int *pt2)
{
int temp;
temp = *pt1;
*pt1 = *pt2;
*pt2 = temp;
}
/*函数功能:交换两个实型数*/
void FloatSwap(float *pt1, float *pt2)
{
float temp;
temp = *pt1;
*pt1 = *pt2;
*pt2 = temp;
}
/*函数功能:交换两个字符串*/
void CharSwap(char *pt1, char *pt2)
{
char temp[15];
strcpy(temp, pt1);
strcpy(pt1, pt2);
strcpy(pt2, temp);
}
/* 函数功能:对学生成绩排序并确定名次 */
void SortScore(struct student *head)
{
student *pt;
int flag=0,a=0;
if(head==NULL)
{
printf("\nlist null!\n");
goto end;
}
do{
flag=0;
pt=head;
/*若后一个节点的总成绩比前一个节点的总成绩高,则交换两个节点中的数据
注意只交换节点数据,而节点顺序不变,即节点next指针内容不进行交换*/
while(pt->next!=NULL)
{
if (pt->next->total>pt->total)
{
CharSwap(pt->class_0, pt->next->class_0);
IntSwap(&pt->num, &pt->next->num);
CharSwap(pt->name, pt->next->name);
for (i=0; i<5; i++)
{
FloatSwap(&pt->score[i], &pt->next->score[i]);
}
FloatSwap(&pt->total, &pt->next->total);
FloatSwap(&pt->ave, &pt->next->ave);
flag=1;
}
pt=pt->next;
}
}while(flag);
pt=head;
while(pt!=NULL)
{
a++;
pt->order=a;
pt=pt->next;
}
end:
printf("");
}
/* 函数的功能:显示所有已经建立好的节点的节点号和该节点中数据项内容 */
void PrintScore(struct student *head)
{
struct student *p=head;
printf("\n****************************学生成绩统计系统********************************\n");
printf("|class|num|name|math|c_prog| eng | polity | sport |总分| ave | order | \n");
while (p!=NULL) /*若不是表尾,则循环打印*/
{
printf("\n%-5s%-5d%-5s", p->class_0, p->num,p->name);
for(i=0;i<5;i++)
{
printf("%-7.1f", p->score[i]);
}
printf("%-7.1f%-7.1f%d", p->total, p->ave,p->order);
p=p->next; /*让p指向下一个节点*/
}
}
/* 函数功能:按学号查找一个节点数据 */
void SearchStudent(struct student *head)
{
struct student *p=head;
int b; /*存放学号的变量*/
printf("输入您要查找学生的学号:\n");
scanf("%d",&b); /*输入学号*/
if(head==NULL)
{
printf("\nlist null!\n");
goto end;
}
while(p!=NULL)/*当记录的指针不为空时*/
{
if(p->num==b)/*显示找到的记录信息*/
{
printf("\n****************************所查找学生的数据**********************************\n");
printf("|class|num|name|math|c_prog| eng | polity | sport |总分| ave | order | \n");
printf("\n%-5s%-5d%-5s", p->class_0, p->num,p->name);
for(i=0;i<5;i++)
{
printf("%-7.1f", p->score[i]);
}
printf("%-7.1f%-7.1f%d", p->total, p->ave,p->order);
printf("\n********************************end*******************************\n");
break;
}
else
p=p->next; /*移动指针,指向下一结点,继续查找*/
}
if(p==NULL) /*指针为空,说明未能找到所要的结点*/
printf("\n找不到所需的学号 %d\n",b);
end:
printf("");
}
/* 函数功能:按学号查找并修改一个节点数据 */
void ModifyStudent(struct student *head)
{
struct student *p=head;
int b; /*存放学号的变量*/
printf("输入您要查找学生的学号:\n");
scanf("%d",&b); /*输入学号*/
if(head==NULL)
{
printf("\nlist null!\n");
goto end;
}
while(p!=NULL)/*当记录的指针不为空时*/
{
if(p->num==b)
{
printf("请输入新数据:");
printf("input number of student:");
scanf("%d",&p->num);
printf("class:");
scanf("%s",p->class_0);
printf("name:");
scanf("%s",p->name);
printf("score:");
for(i=0;i<5;i++)
{
printf("%s:",schoolwork[i]);
scanf("%f",&p->score[i]);
}
TotalScore(p);
break;
}
else
p=p->next; /*移动指针,指向下一结点,继续查找*/
}
if(p==NULL) /*指针为空,说明未能找到所要的结点*/
printf("\n找不到所需的学号 %d\n",b);
end:
printf("");
}
/*函数功能:按学号插入一个节点数据*/
struct student *InsertStudent(struct student *head)
{
struct student *p1,*p2,*info,*k; /*p指向插入位置,q是其前驱,info指新插入记录*/
int n=0;
p1=head;
printf("\ninput a new record:\n");
info=(struct student *)malloc(LEN); /*申请空间*/
if(!info)
{
printf("\nOut of memory"); /*如没有申请到,内存溢出*/
return NULL; /*返回空指针*/
}
printf("input number of student:");
printf("if number is 0,stop inputing.\n");
scanf("%d",&p1->num);
printf("class:");
scanf("%s",p1->class_0);
printf("name:");
scanf("%s",p1->name);
printf("score:");
for(i=0;i<5;i++)
{
printf("%s:",schoolwork[i]);
scanf("%f",&p1->score[i]);
}
TotalScore(info);
info->next=NULL; /*设后继指针为空*/
p1=p2=head; /*将指针赋值给p1,p2*/
if(head==NULL)/*链表为空*/
{
head=info;
info->next=NULL;
}
else
{
while((info->total<p1->total)&&(p1->next!=NULL))
{
p2=p1; /*使p2指向p1刚才的结点*/
p1=p1->next;
} /*使p1后移一个结点*/
if(info->total>=p1->total)
{
if(head==p1)
{
head=info;
info->next=p1;
} /*info作为头指针,p1作为info的后继指针*/
else
{
p2->next=info; /*p2的后继指针是info*/
info->next=p1;
}
} /*info的后继指针是p1*/
else
{
p1->next=info;
info->next=NULL;
}/*p1的后继指针是info,info的后继指针是空*/
}
k=head;
while(k!=NULL) /*重新赋予排序号(排序号因为被插入新数据而改变)*/
{
n++;
k->order=n;
k=k->next;
}
printf("\n ----have inserted the student----\n");
return(head); /*返回头指针*/
}
/*函数功能:按学号删除一个节点数据*/
struct student *DeleteStudent(struct student *head)
{
struct student *p1,*p2;
int number;
printf("请输入要删除学生的学号:");
scanf("%d",&number);
if(head==NULL)
{
printf("\nlist null!\n");
goto end;
}
p1=head;
while(number!=p1->num&&p1->next!=NULL) /*p1指向的不是所要找的结点,并且后面还有结点*/
{
p2=p1;
p1=p1->next;
}/*p1向后移一个结点*/
if(number==p1->num)
{
if(p1==head)
head=p1->next; /*若p1指向的是首结点,把第二个结点地址赋给head*/
else
p2->next=p1->next; /*否则将下一结点地址付给前一结点地址*/
printf("已经删除学号为%d的学生。",number);
n=n-1;
}
else printf("找不到学号为%d的学生。\n",number);/*找不到该结点*/
end:
return(head);
}
/* 函数功能:显示菜单并获得用户键盘输入的选项 */
int menu_select(void)
{
int digit;
printf("\n *************学生成绩管理系统*************\n");
printf(" & 1.添加学生的数据 &\n");
printf(" & 2.输出全部学生数据 &\n");
printf(" & 3.查询一个学生数据 &\n");
printf(" & 4.修改一个学生数据 &\n");
printf(" & 5.插入一个学生数据 &\n");
printf(" & 6.删除一个学生数据 &\n");
printf(" & 7.保存数据 &\n");
printf(" & 8.读取数据 &\n");
printf(" & 0.退出学生记录系统 &\n");
printf(" ******************************************\n");
printf("请选择:");
scanf("%d", &digit); /*在%c前面加一个空格,将存于缓冲区中的回车符读入*/
return digit;
}
/*函数功能:保存数据到文件模块*/
void SaveFile(struct student *head)
{
FILE *fp; /*定义指向文件的指针*/
struct student *p; /* 定义移动指针*/
char outfile[20]; /*保存输出文件名*/
printf("Enter outfile name,for example G:\\f1\\score.txt:\n");
scanf("%s",outfile);
if((fp=fopen(outfile,"wb"))==NULL) /*为输出打开一个二进制文件,如没有则建立*/
{
printf("Can not open file\n");
return;
}
printf("\nSaving file......\n"); /*打开文件,提示正在保存*/
p=head; /*移动指针从头指针开始*/
while(p!=NULL) /*如p不为空*/
{
fwrite(p,LEN,1,fp); /*写入一条数据*/
p=p->next; /*指针后移*/
}
fclose(fp); /*关闭文件*/
printf("-----Save success!!-----\n"); /*显示保存成功*/
}
/*导入信息模块*/
struct student *LoadFile(void)
{
struct student *p,*q,*h=NULL; /*定义记录指针变量*/
FILE *fp; /* 定义指向文件的指针*/
char infile[20]; /*保存文件名*/
printf("Enter infile name,for example G:\\f1\\score.txt:\n");
scanf("%s",infile); /*输入文件名*/
if((fp=fopen(infile,"rb"))==NULL) /*打开一个二进制文件,为读方式*/
{
printf("Can not open file\n"); /*如不能打开,返回头指针*/
return h;
}
printf("\n -----Loading file!-----\n");
p=(struct student *)malloc(LEN); /*申请空间*/
if(!p)
{
printf("Out of memory!\n"); /*如没有申请到,则内存溢出*/
return h; /*返回空头指针*/
}
h=p; /*申请到空间,将其作为头指针*/
while(!feof(fp)) /*循环读数据直到文件尾结束*/
{
if(1!=fread(p,LEN,1,fp))
break; /*如果没读到数据,跳出循环*/
p->next=(struct student *)malloc(LEN); /*为下一个结点申请空间*/
if(!p->next)
{
printf("Out of memory!\n"); /*如没有申请到,则内存溢出*/
return h;
}
q=p; /*保存当前结点的指针,作为下一结点的前驱*/
p=p->next; /*指针后移,新读入数据链到当前表尾*/
}
q->next=NULL; /*最后一个结点的后继指针为空*/
fclose(fp); /*关闭文件*/
printf("Load success!!!\n");
return h; /*返回头指针*/
}
void main()
{
struct student *head=NULL; /*链表定义头指针*/
int digit;
for(;;) /*无限循环*/
{
digit=menu_select();
switch(digit)/*调用主菜单函数,返回值整数作开关语句的条件*/
{
case 1:head=create();TotalScore(head);SortScore(head);break; /*创建链表*/
case 2:SortScore(head);PrintScore(head);break; /*显示全部记录*/
case 3:SearchStudent(head);break; /*查找记录*/
case 4:ModifyStudent(head);break; /*修改记录*/
case 5:head=InsertStudent(head); break; /*插入记录*/
case 6:head=DeleteStudent(head);break; /*删除记录*/
case 7:SaveFile(head);break; /*保存数据*/
case 8:head=LoadFile();break; /*读取数据*/
case 0:exit(0); /*如菜单返回值为0程序结束*/
}
}
}