#include<stdio.h>
#include<malloc.h>
#include<string.h>
struct Student
{
char name[10];
char subject[10];
int num;
int grade;
Student *next;
};
void StuMain(); //学生成绩管理系统的主函数,由main函数调用
void StuInput(Student *); //学生成绩管理系统的输入函数,由主函数调用
void StuSelect(Student *); //学生成绩管理系统的查找函数,由主函数调用
void StuAlter(Student *); //学生成绩管理系统的修改函数,由主函数调用
void StuInsert(Student *); //学生成绩管理系统的插入函数,由主函数调用
void StuDelect(Student *); //学生成绩管理系统的删除函数,由主函数调用
void StuSave(Student *); //学生成绩管理系统的存储函数,由主函数调用
void StuOutput(Student *p); //输出函数
int StuImport(Student *head,Student *p); //输入函数
void StuOutput(Student *p) //打印函数,将链表的该节点信息输出
{
printf("学生姓名:");
printf("%s ",p->name);
printf("学生号:");
printf("%d ",p->num);
printf("科目: ");
printf("%s ",p->subject);
printf("学生成绩:");
printf("%d \n",p->grade);
}
int StuImport(Student *head,Student *p)
{
Student *Opinion=(Student *)malloc(sizeof(Student)); //用来判断输入节点中学生号是否有重复
Opinion=head->next;
printf("学生姓名:\n");
scanf("%s",p->name);
printf("学生号:\n");
scanf("%d",&p->num);
printf("科目:\n");
scanf("%s",p->subject);
if(Opinion!=NULL)
{
if(Opinion->num==p->num&&!strcmp(Opinion->subject,p->subject))
{
printf("该学生这门科目已有成绩,请重新输入\n");
return 1;
}
Opinion=Opinion->next;
}
printf("学生成绩:\n");
scanf("%d",&p->grade);
return 0;
}
void main()
{
StuMain();
}
void StuMain()
{
char decide='y'; //定义while变量,函数是否继续进行
int num=1; //定义switch变量,函数跳转到哪个子函数
Student *head; //定义链表的头指针
head=(Student *)malloc(sizeof(Student)); //给头指针开辟空间
head->next=NULL; //初始化头指针
while(decide!='n')
{
printf(" ***************************************************\n");
printf(" ********** 1 输入 2查找 3修改 4插入 ********\n");
printf(" ********** 5 删除 6存储 7退出 ********\n");
printf(" ***************************************************\n");
scanf("%d",&num);
switch(num)
{
case 1:
StuInput(head);
break;
case 2:
StuSelect(head);
break;
case 3:
StuAlter(head);
break;
case 4:
StuInsert(head);
break;
case 5:
StuDelect(head);
break;
case 6:
StuSave(head);
break;
default:
decide='n';
break;
}
};
}
void StuInputHand(Student *head); //学生成绩管理系统的手动输入函数,由输入函数调用
void StuInputFile(Student *head); //学生成绩管理系统的文件输入函数,由输入函数调用
void StuInput(Student *head) //学生成绩管理系统的输入函数,由主函数调用
{
char decide='y'; //定义while变量,函数是否继续进行
int num; //定义switch变量,函数跳转到哪个子函数
while(decide!='n')
{
printf(" ***************************************************\n");
printf(" ** 1 手动输入 2文件输入 3退出 **\n");
printf(" ***************************************************\n");
scanf("%d",&num);
switch(num)
{
case 1:
StuInputHand(head);
break;
case 2:
StuInputFile(head);
default:
decide='n';
break;
}
}
}
void StuInputHand(Student *head) //学生成绩管理系统的手动输入函数,由输入函数调用
{
if(head->next==NULL)
{
Student *point=(Student *)malloc(sizeof(Student)); //链表中最后一个节点,只在该函数中存在
point->next=NULL;
int decide=1;
while(decide!=0)
{
Student *p=(Student *)malloc(sizeof(Student));
p->next=NULL;
StuImport(head,p);
if(head->next==NULL)
{
head->next=p;
point=p;
}
else
{
point->next=p;
point=p;
}
printf("是否继续:1/0\n");
scanf("%d",&decide);
}
}
else
printf("管理系统中已存在信息,若想输入学生信息,请转插入子系统");
}
void StuInputFile(Student *head) //学生成绩管理系统的文件输入函数,由输入函数调用
{
if(head->next!=NULL)
{
printf("学生管理系统中已有信息,请跳转到插入选项\n");
return ;
}
FILE *fp;
printf("请输入文件名(包括物理地址)\n");
char filename[10];
scanf("%s",filename);
if((fp=fopen(filename,"r"))==NULL)
{
printf("can not open file\n");
return;
}
Student *point=(Student *)malloc(sizeof(Student));
Student *Opinion=(Student *)malloc(sizeof(Student)); //用来判断输入节点中学生号是否有重复
while(!feof(fp)) {
Opinion=head->next;
Student *p=(Student *)malloc(sizeof(Student));
p->next=NULL;
fread(p,sizeof(Student),1,fp);
if(Opinion!=NULL)
{
if(Opinion->num==p->num&&!strcmp(Opinion->subject,p->subject))
{
printf("该文件中有重复学生信息,请验明再传输\n");
head->next=NULL;
return ;
}
Opinion=Opinion->next;
}
if(head->next==NULL)
{
head->next=p;
point=p;
}
else
{
point->next=p;
point=p;
}
};
Opinion=head->next;
while(Opinion->next!=NULL)
{
Opinion=Opinion->next;
if(Opinion->next->next==NULL)
Opinion->next=NULL;
};
fclose(fp);
printf("传输成功\n");
}
void StuSelectErg(Student *head); //学生成绩管理系统的遍历函数,由查找函数调用
void StuSelectNumFind(Student *head); //学生成绩管理系统的按学号查找函数,由查找函数调用
void StuSelectSubFind(Student *head); //学生成绩管理系统的按科目查找函数,由查找函数调用
void StuSelect(Student *head) //学生成绩管理系统的查找函数,由主函数调用
{
char decide='y'; //定义while变量,函数是否继续进行
int num; //定义switch变量,函数跳转到哪个子函数
while(decide!='n')
{
printf(" ***************************************************\n");
printf(" **** 1 遍历 2学号查找 3科目查找 4退出 ****\n");
printf(" ***************************************************\n");
scanf("%d",&num);
switch(num)
{
case 1:
StuSelectErg(head);
break;
case 2:
StuSelectNumFind(head);
break;
case 3:
StuSelectSubFind(head);
break;
default:
decide='n';
break;
}
}
}
void StuSelectErg(Student *head) //学生成绩管理系统的遍历函数,由查找函数调用
{
Student *p=(Student *)malloc(sizeof(Student));
p=head->next;
int i=1;
while(p!=NULL)
{
printf("第%d位学生信息:\n",i);
StuOutput(p);
p=p->next;
i++;
}
}
void StuSelectNumFind(Student *head) //学生成绩管理系统的查找子系统,有查找函数调用
{
int num;
printf("输入想要查找学生的学生号:\n");
scanf("%d",&num);
Student *p=(Student *)malloc(sizeof(Student));
p=head->next;
int i=1;
while(p!=NULL)
{
if(num==p->num)
{
StuOutput(p);
i++;
}
p=p->next;
}
if(i==1)
printf("没有该学生信息");
}
void StuSelectSubFind(Student *head) //学生成绩管理系统的按科目查找函数,由查找函数调用
{
char Sub[10];
printf("输入想要查找科目:\n");
scanf("%s",Sub);
Student *p=(Student *)malloc(sizeof(Student));
p=head->next;
int i=1;
while(p!=NULL)
{
if(!strcmp(Sub,p->subject))
{
StuOutput(p);
i++;
}
p=p->next;
}
if(i==1)
printf("没有该学生信息");
}
void StuAlter(Student *head) //学生成绩管理系统的修改函数,由主函数调用
{
int num;
printf("输入想要查找学生的学生号:\n");
scanf("%d",&num);
char Sub[10];
printf("输入想要查找科目:\n");
scanf("%s",Sub);
Student *p=(Student *)malloc(sizeof(Student));
p=head->next;
int i=1;
while(p!=NULL)
{
if(num==p->num&&!strcmp(Sub,p->subject))
{
printf("输入修改成绩:\n");
scanf("%d",&p->grade);
printf("修改成功\n");
i++;
}
p=p->next;
if(i==1)
printf("没有该学生信息");
}
}
void StuInsert(Student *head) //学生成绩管理系统的插入函数,由主函数调用
{
Student *point=(Student *)malloc(sizeof(Student));
point=head->next;
while(point->next!=NULL)
point=point->next; //找到尾结点
char decide='y'; //定义while变量,函数是否继续进行
int num; //定义switch变量,函数跳转到哪个子函数
while(decide!='n')
{
printf(" ***************************************************\n");
printf(" **** 1 头插 2尾插 3退出 ****\n");
printf(" ***************************************************\n");
scanf("%d",&num);
Student *p=(Student *)malloc(sizeof(Student));
switch(num)
{
case 1:
StuImport(head,p);
p->next=head->next;
head->next=p;
printf("插入成功\n");
break;
case 2:
StuImport(head,p);
point->next=p;
p->next=NULL;
printf("插入成功\n");
break;
default:
decide='n';
break;
}
}
}
void StuDelect(Student *head) //学生成绩管理系统的删除函数,由主函数调用
{
int num;
printf("输入想要删除学生的学生号:\n");
scanf("%d",&num);
char Sub[10];
printf("输入想要删除科目:\n");
scanf("%s",Sub);
Student *p=(Student *)malloc(sizeof(Student));
p->next=head->next;
int i=1;
while(p->next!=NULL)
{
if(num==p->next->num&&!strcmp(Sub,p->next->subject))
{
StuOutput(p->next);
printf("是否删除:1/0\n");
scanf("%d",&i);
if(num==head->next->num&&!strcmp(Sub,head->next->subject))
{
head->next=head->next->next;
}
else
{
p->next=p->next->next;
}
i=2;
printf("删除成功\n");
break;
}
p=p->next;
}
if(i==1)
printf("没有该学生信息\n");
}
void StuSave(Student *head) //学生成绩管理系统的存储函数,由主函数调用
{
FILE *fp;
char filename[10];
printf("请输入存储文件名(包括物理地址)\n");
scanf("%s",filename);
Student *p=(Student *)malloc(sizeof(Student));
p=head->next;
if((fp=fopen(filename,"w"))==NULL)
{
printf("cannot open file");
return;
}
printf("input data:/n");
while(p!=NULL)
{
fwrite(p,sizeof(Student),1,fp); /*成块写入文件*/
p=p->next;
}
fclose(fp);
}