- #include <stdio.h>
- #include <conio.h>
- #include <windows.h>
- #include <stdlib.h>
- #include <time.h>
- #include <string.h>
- typedef struct STU{
- char name[20];
- char num[10];
- int grade1;//3种不同成绩
- int grade2;
- int grade3;
- float ave;//均分
- struct STU *next;
- }STU;
- STU *head;
- void creathead();//创建表头
- STU * mallocnode();//申请新节点
- int insertonenode(STU *t);//把节点移到链表尾部
- void readfile();//读入文件
- void savefile();//存档
- int getinformation(STU *t);//增加一个信息
- int outputinformation(STU *t);//输出一个节点的信息
- int sort(); //按学号从小到大排序
- void outputall(); //输出所有信息
- int output_name(); //按姓名输出信息
- int output_num(); //按学号输出学生信息
- int scaning(); //屏幕人机互动函数
- int del_single(); //按单一学号删除学生
- int chang_single(); //按学号修改学生
- int del_more();//按学号范围删除
- int main()
- {
- creathead();
- readfile();
- scaning();
- }
- int scaning() //屏幕人机互动函数 p
- {
- int a;
- STU *p;
- while(1)
- {
- start:
- system("cls");
- printf("***********************学生学籍管理系统*****************************\\n");
- printf("1.\\t增加学生\\n");
- printf("2.\\t删除学生\\n");
- printf("3.\\t输出所有学生信息\\n");
- printf("4.\\t查询学生信息\\n");
- printf("5.\\t修改学生信息\\n");
- printf("6.\\t存档\\n");
- printf("7.\\t退出系统\\n");
- a=getch();
- while(a>'7'||a<'1')
- {
- system("cls");
- printf("错误的选项");
- getch();
- goto start;
- }
- switch(a)
- {
- case '1':{
- system("cls");
- p=mallocnode();
- getinformation(p);
- insertonenode(p);
- break;}
- case '2':{
- system("cls");
- printf("***********************学生学籍管理系统*****************************\\n");
- printf("\\t1.按学号删除");
- printf("\\t2.按学号区间删除\\n");
- int c;
- c=getch();
- switch(c)
- {
- case '1':del_single();getch();break;
- case '2':del_more();getch();break;
- }
- break;
- }
- case '3':{
- system("cls");
- outputall();
- getch();
- break;
- }
- case '4':{
- system("cls");
- printf("***********************学生学籍管理系统*****************************\\n");
- printf("\\t1.按学号查询");
- printf("\\t2.按姓名查询");
- int b;
- b=getch();
- switch(b)
- {
- case '1':{
- system("cls");
- printf("请输入学号:");
- output_num();
- getch();
- break;
- }
- case '2':{
- system("cls");
- printf("请输入姓名:");
- output_name();
- getch();
- break;
- }
- }
- break;
- }
- case '5' :{
- system("cls");
- chang_single();
- getch();
- break;
- }
- case '6':{
- system("cls");
- savefile();
- getch();
- free(head);
- break;
- }
- case '7':{
- exit(0);
- break;
- }
- }
- }
- return 0;
- }
- void creathead()//创建表头
- {
- STU *p;
- p=(STU*)malloc(sizeof(struct STU));
- p->next=NULL;
- head=p;
- }
- STU * mallocnode()//建立一个新节点
- {
- STU *p;
- p=(STU*)malloc(sizeof(STU));
- if (p==NULL)
- return NULL;
- int i;
- for(i=0;i<20;i++)
- p->name[i]='\\0';
- for(i=0;i<10;i++)
- p->num[i]='\\0';
- p->grade1=0;
- p->grade2=0;
- p->grade3=0;
- p->ave=0.0;
- p->next=NULL;
- return p;
- }
- int insertonenode(STU *t)//把节点移到链表尾部
- {
- STU *p;
- p=head;
- while(p->next)
- {
- p=p->next;
- }
- p->next=t;
- }
- void readfile()//读入文件
- {
- FILE *fp;
- STU *p;
- fp=fopen("save.txt","r");
- if(!p)
- {
- printf("此文件不存在!");
- return;
- }
- p=mallocnode();
- while((fscanf(fp,"%s %s %d %d %d %f",p->name,p->num,&p->grade1,&p->grade2,&p->grade3,&p->ave))>0)
- {
- insertonenode(p);
- p = mallocnode();
- }
- fclose(fp);
- }
- void savefile()//存档
- {
- STU *p;
- FILE *fp;
- p=head->next;
- if(p==0)
- {
- printf("没有学生信息");
- return;
- }
- fp=fopen("save.txt","w+");
- if(!fp)
- {
- printf("文件不存在");
- return ;
- }
- while(p)
- {
- fprintf(fp,"%s %s %d %d %d %f\\n",p->name,p->num,p->grade1,p->grade2,p->grade3,p->ave);
- p=p->next;
- }
- printf("存档成功");
- fclose(fp);
- }
- int getinformation(STU *t)//增加一个信息
- {
- STU *p;
- p=head->next;
- printf("输入学生的学号:\\n");
- scanf("%s",t->num);
- while(p)
- {
- if(p->num==t->num)
- printf("此学号已经被使用");
- p=p->next;
- }
- printf("学生的姓名:\\n");
- scanf("%s",t->name);
- srand((unsigned)time(0));
- int i,j,k;
- i=rand()%50+50;
- t->grade1=i;
- j=rand()%50+50;
- t->grade2=j;
- k=rand()%50+50;
- t->grade3=k;
- t->ave=(i+j+k)/3;
- return 0;
- }
- int outputinformation(STU *t)//输出一个节点的信息
- {
- printf("\\n%s",t->num);
- printf("%12s",t->name);
- printf("%12d",t->grade1);
- printf("%12d",t->grade2);
- printf("%12d",t->grade3);
- printf("%12.1f",t->ave);
- }
- int sort() //按学号从小到大排序
- {
- STU *p;
- STU *min;
- char t[10];
- min=head->next;
- p=min->next;
- while(p)
- {
- while(p){
- if(strcmp(min->num,p->num)<0)
- {
- strcpy(t,min->num);
- strcpy(min->num,p->num);
- strcpy(p->num,t);
- }
- p=p->next;
- }
- min=min->next;
- p=min->next;
- }
- }
- void outputall() //输出所有信息
- {
- STU *p;
- p=head->next;
- if(!p)
- {
- printf("没有学生信息");
- return;
- }
- int sort();
- printf("学号 姓名 语文成绩 数学成绩 英语成绩 平均成绩");
- while(p)
- {
- outputinformation(p);
- p=p->next;
- }
- }
- int output_name() //按姓名输出信息
- {
- STU *p;
- p=head->next;
- char name[20];
- char flag=0;
- printf("请输入一个人的姓名:");
- scanf("%s",name);
- while(p)
- {
- if(strcmp(p->name,name)==0)
- {
- printf("学号 姓名 语文成绩 数学成绩 英语成绩 平均成绩");
- outputinformation(p);
- flag=1;
- break;
- }
- p=p->next;
- }
- if(!flag)
- printf("对不起,不存在%s的人",name);
- }
- int output_num() //按学号输出学生信息
- {
- char num[20];
- char flag=0;
- STU *p;
- p=head->next;
- scanf("%s",num);
- while(p)
- {
- if(strcmp(p->num,num)==0)
- {
- printf("学号 姓名 语文成绩 数学成绩 英语成绩 平均成绩");
- outputinformation(p);
- flag=1;
- break;
- }
- p=p->next;
- }
- if(!flag)
- printf("没有此学号学生");
- }
- int del_single() //按单一学号删除学生
- {
- char num[10];
- STU *p,*q;
- q=head;
- p=head->next;
- char flag=0;
- printf("请输入要删的学号:");
- scanf("%s",num);
- while(p)
- {
- if(strcmp(p->num,num)==0)
- {
- free(p);
- q->next=p->next;
- flag=1;
- break;
- }
- q=q->next;
- p=p->next;
- }
- if(!flag)
- printf("没有此学号的学生");
- }
- int chang_single() //按学号修改学生
- {
- char num[10];
- char name[20];
- int flag=0;
- STU *p;
- p=head->next;
- printf("请输入学号:");
- scanf("%s",num);
- while(p)
- {
- if(strcmp(p->num,num)==0)
- {
- printf("请输入姓名:");
- scanf("%s",p->name);
- printf("请输入语文成绩:");
- scanf("%d",&p->grade1);
- printf("请输入数学成绩:");
- scanf("%d",&p->grade2);
- printf("请输入英语成绩:");
- scanf("%d",&p->grade3);
- p->ave=(p->grade1+p->grade2+p->grade3)/3;
- printf("成员已经修改完毕");
- flag=1;
- break;
- }
- p=p->next;
- }
- if(!flag)
- printf("找不到对应学号学生");
- }
- int del_more()
- {
- printf("输出从小到大的两个数:");
- int a,b;
- STU *p,*q;
- p=head->next;
- q=head;
- int t=0;
- scanf("%d%d",&a,&b);
- while(p)
- {
- if(atoi(p->num)>a&&atoi(p->num)<b)
- {
- q->next=p->next;
- t++;
- }
- p=p->next;
- q=q->next;
- }
- free(p);
- if(!t)
- printf("在此学号区间没有学生");
- else printf("删除成功");
- }
- //该片段来自于http://www.codesnippet.cn/detail/1211201410946.html
来源: http://www.codesnippet.cn/detail/1211201410946.html