回复 5楼 wp231957
可是在我的编译器上,这个性别的数据录入会直接跳过,所以连最开始的创建功能都无法实现。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
struct student
{
int sno;
char name[20];
char sex;
double score[3];
struct student *next;
};
typedef struct student ST;
ST *create(ST *head);
//创建学生文件
void save(ST *head);
//保存学生信息
ST *add(ST *head);
//添加学生信息
void seal(ST *head);
//显示学生信息
ST *delet(ST *head);
//删除学生信息
ST *change(ST *head);
//修改学生信息
void *search(ST *head);
//查找学生信息
void *sort(ST *head);
//排序查看
ST *read(ST *head);
//读文件
int main()
{
ST *head;
while(1)
{
int c;
system("cls");
printf("\n******************主菜单******************\n");
printf("\n1.创建学生信息文件。");
printf("\n2.查看学生信息。");
printf("\n3.增加学生信息。");
printf("\n4.删除学生信息。");
printf("\n5.修改学生信息。");
printf("\n6.查找学生信息。");
printf("\n7.排序学生信息。");
printf("\n******************************************\n");
printf("\n请输入选项:");
scanf("%d",&c);
switch(c)
{
case 1:head=create(head);
break;
case 2:head=read(head);
if(head==NULL)
{
printf("\n请先选择1!!!\n");
getch();
}
else
seal(head);
}
}
}
ST *create(ST *head)
{
int total=0;
FILE *fp;
ST *p,*p1,*tail;
fp=fopen("ST.txt","r");
if(fp==NULL)
{
head=p=tail=NULL;
while(1)
{
p=(ST*)malloc(sizeof(ST));
p->next=NULL;
bb1:printf("\n请输入学生学号(输入0结束录入):");
scanf("%d",&p->sno);
if(p->sno==0)
{
if(total==0)
{
printf("\n你输入了0个学生信息,没有创建学生信息文件。\n");
getch();
free(p);
return (head);
}
else
{
break;
}
}
p1=head;
while(p1!=NULL)
{
if(p->sno==p1->sno)
{
printf("\n\n学生学号重复输入。按任意键返回重新输入。");
free(p);
getch();
goto bb1;
}
p1=p1->next;
}
printf("\n请输入学生性别:");
scanf("%c",&p->sex);
printf("\n请输入学生姓名:");
scanf("%s",p->name);
printf("\n请依次输入学生三门课成绩:");
scanf("%lf%lf%lf",&p->score[0],&p->score[1],&p->score[2]);
p->name[19]=0;
if(head==NULL)
{
head=p;
tail=p;
}
else
{
tail->next=p;
tail=p;
}
total++;
}
tail->next=NULL;
free(p);
printf("\n\n总共输入了%d个学生信息。",total);
save(head);
}
return head;
}
void save(ST *head)
{
FILE *fp;
ST *t;
if((fp=fopen("ST.txt","w"))==NULL)
{
printf("\n打开文件失败!\n");
getch();
exit(0);
}
t=head;
while(t!=NULL)
{
fwrite(t,sizeof(ST),1,fp);
t=t->next;
}
fclose(fp);
printf("\n保存成功!\n");
getch();
}
void seal(ST *head)
//显示学生信息
{
ST *p=head;
int i=0;
printf("\n学号
姓名
性别
分数\n\n");
while(p!=NULL)
{
printf("%d
%s
%c
%.2lf
%.2lf
%.2lf\n",p->sno,p->name,p->sex,p->score[0],p->score[1],p->score[2]);
p=p->next;
i++;
}
printf("\n共有%d名学生。\n",i);
getch();
}
ST *read(ST *head)
{
FILE *fp;
ST *p,*p1;
if((fp=fopen("ST.txt","r"))==NULL)
{
printf("\n打开文件失败,没有该文件。\n");
printf("\n按任意键返回主菜单\n");
getch();
return 0;
}
rewind(fp);
p1=(ST *)malloc(sizeof(ST));
head=p=p1;
while(!feof(fp))
{
if(fread(p1,sizeof(ST),1,fp)!=1);
break;
p1->next=(ST *)malloc(sizeof(ST));
p=p1;
p1=p1->next;
}
p->next=NULL;
fclose(fp);
return head;
}