#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"process.h"
/*单链表结构*/
typedef struct LNote {
char num[15];
char name[10];
int score;
struct LNote *next;
}LNote,*List;
/*初始化*/
List Start()
{
List L;
L=(List)malloc(sizeof(LNote));
L->next=NULL;
return L;
}
/*插入并排序*/
void Insert(List L,char num[],char name[],int score)
{
List pre,p,s;
p=L;
s=(List)malloc(sizeof(LNote));
strcpy(s->num,num);
strcpy(s->name,name);
s->score=score;
do {
pre=p;
p=p->next;
} while(p!=NULL&&s->score
s->next=pre->next;
pre->next=s;
printf("\n\t\t\t\t插入成功");
}
/*删除*/
void Delete(List L,char num[])
{
List pre,p;
p=L;
if(p->next==NULL) {
printf("\n\t\t\t\t记录为空");
goto end;
}
while(p!=NULL&&strcmp(p->num,num)!=0) {
pre=p;
p=p->next;
}
if(p==NULL) {
printf("\n\t\t\t\t没有该学生的数据");
goto end;
}
if(strcmp(p->num,num)==0) {
pre->next=p->next;
free(p);
printf("\n\t\t\t\t删除成功");
}
end:
printf("\n");
}
/*遍历*/
void Traverse(List L)
{
List p;
p=L->next;
if(p==NULL)
printf("\n\t\t\t\t没有记录");
else {
printf("\n\t\t学号\t\t姓名\t成绩\n");
while(p!=NULL) {
printf("\t\t%-15s%-10s%-5d\n",p->num,p->name,p->score);
p=p->next;
}
}
}
/*查找*/
void Find(List L,char num[])
{
List p;
p=L;
while(p!=NULL&&strcmp(p->num,num)!=0)
p=p->next;
if(p==NULL)
printf("\t\t\t\t没有找到");
else {
printf("\n\t\t学号\t\t姓名\t成绩\n");
printf("\t\t%-15s%-10s%-5d",p->num,p->name,p->score);
}
}
/*保存*/
void Save(List L)
{
FILE *fp;
List p;
p=L->next;
if((fp=fopen("学生管理.txt","w"))==NULL) {
printf("文件打开失败\n");
exit(1);
}
while(p!=NULL) {
fprintf(fp,"%-15s%-10s%-4d\n",p->num,p->name,p->score);
p=p->next;
}
printf("\n\t\t\t\t保存成功");
}
/*统计*/
void Tegether(List L)
{
List p,q;
float a=0,b=0,c=0,length=0;
q=L->next;
while(q!=NULL) {
length++;
q=q->next;
}
if(length==0)
printf("\n\t\t\t\t记录为空\n");
else {
p=L->next;
while(p!=NULL) {
if(p->score>=80&&p->score<=100)
a++;
if(p->score>=60&&p->score<80)
b++;
if(p->score>=0&&p->score<60)
c++;
p=p->next;
}
printf("\n\t优秀%.0f人数\t及格%.0f人\t\t不及格%.0f人\n",a,b,c);
printf("\t优秀率%-3.2f\t及格率%-3.2f\t不及格率%-3.2f",a/length,b/length,c/length);
}
}
/*读取文件*/
void Read(List L)
{
FILE *fp;
char num[15];
char name[10];
int score;
List s,pre;
if((fp=fopen("学生管理.txt","r+"))==NULL)
printf("文件打开失败");
printf("%s\t\t%s\t%s\n","学号","姓名","成绩");
pre=L;
while(!feof(fp)) {
fscanf(fp,"%s%s%d\n",num,name,&score);
printf("%-15s%-10s%-4d\n",num,name,score);
s=(List)malloc(sizeof(LNote));
strcpy(s->num,num);
strcpy(s->name,name);
s->score=score;
pre->next=s;
pre=s;
}
s->next=NULL;
if(fclose(fp))
printf("文件关闭失败");
}
int scan()
{
int d,c=2;
printf("\t\t\t\t%c 1.初始化 %c\n\n",c,c);
printf("\t\t\t\t%c 2.输入数据 %c\n\n",c,c);
printf("\t\t\t\t%c 3.删除数据 %c\n\n",c,c);
printf("\t\t\t\t%c 4.遍历 %c\n\n",c,c);
printf("\t\t\t\t%c 5.保存为数据文件 %c\n\n",c,c);
printf("\t\t\t\t%c 6.查找 %c\n\n",c,c);
printf("\t\t\t\t%c 7.统计 %c\n\n",c,c);
printf("\t\t\t\t%c 8.读取数据文件 %c\n\n",c,c);
printf("\t\t\t\t%c 9.退出 %c\n\n",c,c);
do {
printf("\t\t\t\t 输入操作:");
scanf("%d",&d);
if(d<=0||d>9)
printf("\n\t\t\t\t无此操作\n\n");
} while(d<0||d>9);
return d;
}
main()
{
int quit=0,score;
char name[10],num[15];
List L;
L=Start();
printf("\t\t\t\t***** 欢迎使用 *****\n\n");
while(!quit) {
switch(scan()) {
case 1:
Start();
printf("\n\n");
break;
case 2:
printf("\n\t\t\t\t学号:");
scanf("%s",num);
printf("\n\t\t\t\t姓名:");
scanf("%s",name);
printf("\n\t\t\t\t分数:");
scanf("%d",&score);
Insert(L,num,name,score);
printf("\n\n");
break;
case 3:
printf("\n\t\t\t\t输入学号:");
scanf("%s",num);
Delete(L,num);
printf("\n");
break;
case 4:
Traverse(L);
printf("\n\n");
break;
case 5:
Save(L);
printf("\n\n");
break;
case 6:
printf("\n\t\t\t\t输入学号:");
scanf("%s",num);
Find(L,num);
printf("\n\n");
break;
case 7:
Tegether(L);
printf("\n\n");
break;
case 8:
Read(L);
printf("\n\n");
break;
case 9:
quit=1;
break;
}
}
}