#include〈string、h>
structStudent
{
charname[10];
char subject[10];
int num;
intgrade;
Student*next;
};
voidStuMain(); //学生成绩管理系统得主函数,由main函数调用
voidStuInput(Student*);//学生成绩管理系统得输入函数,由主函数调用
voidStuSelect(Student*);//学生成绩管理系统得查找函数,由主函数调用
voidStuAlter(Student*); //学生成绩管理系统得修改函数,由主函数调用
voidStuInsert(Student *);//学生成绩管理系统得插入函数,由主函数调用
void StuDelect(Student*);//学生成绩管理系统得删除函数,由主函数调用
void StuSave(Student *); //学生成绩管理系统得存储函数,由主函数调用
void StuOutput(Student*p); //输出函数
intStuImport(Student*head,Student*p);//输入函数
voidStuOutput(Student*p) //打印函数,将链表得该节点信息输出
{
printf("学生姓名:
”);
printf(”%s ",p—>name);
printf(”学生号:
”);
ﻩprintf(”%d ",p->num);
printf("科目:
");
ﻩprintf("%s ",p-〉subject);
ﻩprintf(”学生成绩:
");
ﻩprintf(”%d \n”,p-〉grade);
}
intStuImport(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");
ﻩﻩreturn1;
ﻩ}
ﻩﻩOpinion=Opinion—>next;
ﻩ}
printf("学生成绩:
\n");
ﻩscanf(”%d",&p->grade);
ﻩreturn0;
}
void main()
{
StuMain();
}
void StuMain()
{
chardecide='y’; //定义while变量,函数就是否继续进行
ﻩintnum=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)
{
case1:
ﻩﻩ StuInput(head);
ﻩbreak;
case2:
ﻩ StuSelect(head);
ﻩbreak;
case 3:
StuAlter(head);
break;
ﻩcase4:
StuInsert(head);
ﻩﻩbreak;
ﻩcase5:
ﻩ StuDelect(head);
ﻩﻩ break;
ﻩcase6:
StuSave(head);
ﻩ break;
ﻩdefault:
ﻩﻩdecide='n’;
break;
ﻩ}
};
}
voidStuInputHand(Student*head); //学生成绩管理系统得手动输入函数,由输入函数调用
voidStuInput*head); //学生成绩管理系统得文件输入函数,由输入函数调用
void StuInput(Student*head)//学生成绩管理系统得输入函数,由主函数调用
{
char decide=’y'; //定义while变量,函数就是否继续进行
ﻩintnum; //定义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:
ﻩﻩStuInput);
ﻩdefault:
ﻩdecide=’n’;
ﻩﻩbreak;
ﻩ}
}
}
voidStuInputHand(Student*head)//学生成绩管理系统得手动输入函数,由输入函数调用
{
if(head->next==NULL)
ﻩ{
Student*point=(Student*)malloc(sizeof(Student)); //链表中最后一个节点,只在该函数中存在
ﻩ point->next=NULL;
intdecide=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("管理系统中已存在信息,若想输入学生信息,请转插入子系统”);
}
voidStuInput*head) //学生成绩管理系统得文件输入函数,由输入函数调用
{
if(head->next!
=NULL)
ﻩﻩ{
ﻩ printf("学生管理系统中已有信息,请跳转到插入选项\n");
return;
ﻩ}
ﻩﻩ FILE*fp;
printf("请输入文件名(包括物理地址)\n");
ﻩ char [10];
ﻩﻩﻩscanf(”%s",);
if((fp=fopen(,"r”))==NULL)
ﻩ {
ﻩ printf("cannotopenfile\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”);
}
voidStuSelectErg(Student *head);//学生成绩管理系统得遍历函数,由查找函数调用
voidStuSelectNumFind(Student*head);//学生成绩管理系统得按学号查找函数,由查找函数调用
void StuSelectSubFind(Student*head); //学生成绩管理系统得按科目查找函数,由查找函数调用
voidStuSelect(Student *head) //学生成绩管理系统得查找函数,由主函数调用
{
chardecide='y’; //定义while变量,函数就是否继续进行
intnum; //定义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;
case3:
StuSelectSubFind(head);
ﻩﻩbreak;
ﻩdefault:
ﻩdecide=’n';
ﻩbreak;
}
}
}
voidStuSelectErg(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++;
ﻩ}
}
voidStuSelectNumFind(Student*head) //学生成绩管理系统得查找子系统,有查找函数调用
{
ﻩintnum;
ﻩ 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("没有该学生信息");
}
voidStuSelectSubFind(Student*head)//学生成绩管理系统得按科目查找函数,由查找函数调用
{
charSub[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)//学生成绩管理系统得修改函数,由主函数调用
{
intnum;
printf("输入想要查找学生得学生号:
\n");
scanf("%d",&num);
ﻩchar Sub[10];
ﻩ printf(”输入想要查找科目:
\n");
scanf("%s",Sub);
Student *p=(Student *)malloc(sizeof(Student));
p=head->next;
ﻩinti=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("没有该学生信息");
ﻩ}
}
voidStuInsert(Student*head)//学生成绩管理系统得插入函数,由主函数调用
{
Student*point=(Student *)malloc(sizeof(Student));
ﻩpoint=head->next;
ﻩﻩ while(point->next!
=NULL)
ﻩpoint=point—〉next; //找到尾结点
ﻩ chardecide=’y'; //定义while变量,函数就是否继续进行
ﻩ intnum; //定义switch变量,函数跳转到哪个子函数
while(decide!
=’n')
{
printf(” ***************************************************\n");
printf("**** 1头插 2尾插 3 退出 ****\n");
printf("***************************************************\n”);
scanf("%d",&num);
ﻩﻩ Student *p=(Student*)malloc(sizeof(Student));
switch(num)
ﻩﻩﻩ{
ﻩ case1:
ﻩﻩ 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;
ﻩﻩﻩ}
}
}
voidStuDelect(Student*head) //学生成绩管理系统得删除函数,由主函数调用
{
int num;
ﻩ printf("输入想要删除学生得学生号:
\n");
scanf("%d",&num);
charSub[10];
ﻩprintf("输入想要删除科目:
\n");
scanf("%s”,Sub);
Student *p=(Student*)malloc(sizeof(Student));
ﻩﻩp—>next=head->next;
inti=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(n