#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define LEN sizeof(struct student)
#include <string.h>
#include <conio.h>
struct student
{float number;
char name[20];
float english;
float math;
float computer;
float sum;
float average;
long rank;
struct student *next;
};
typedef struct student files;
int n,k;/*n,k为全局变量,本程序中的函数均可以使用它*/
files *create() /*函数create功能:创建链表*/
{files *head,*p1,*p2,*p3;
int i;
n=0;
p1=p2=p3=(files *)malloc(LEN);
head=p3;
printf("请输入学生资料,输0退出!\n");
printf("请输入学生学号(学号应大于0):");/*输入学号,学号应大于0*/
scanf("%f",&p1->number);
if(p1->number==0) goto end; /*当输入的学号为0时,转到末尾,结束创建链表*/
printf("请输入学生姓名:");
scanf("%s",&p1->name);
printf("请输入英语成绩(0~100):");
scanf("%f",&p1->english);
while(p1->english<0||p1->english>100)
{printf("输入错误,请重新输入英语成绩");
scanf("%f",&p1->english);
}
printf("请输入数学成绩(0~100):");
scanf("%f",&p1->math);
while(p1->math<0||p1->math>100)
{printf("输入错误,请重新输入数学成绩");
scanf("%f",&p1->math);
}
printf("请输入计算机成绩(0~100):");
scanf("%f",&p1->computer);
while(p1->computer<0||p1->computer>100)
{printf("输入错误,请重新输入计算机成绩");
scanf("%f",&p1->computer);
}
p1->sum=p1->english+p1->math+p1->computer;
p1->average=p1->sum/3;
head=NULL;
while(p1->number!=0)
{n=n+1;
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
p1=(files *)malloc(LEN);
printf("请输入学生资料,输0退出!\n");
repeat2:printf("请输入学生学号(学号应大于0):");
scanf("%f",&p1->number);
if(p1->number==0) goto end; /*当输入的学号为0时,转到末尾,结束创建链表*/
else
{p3=head;
if(n>0)
{for(i=0;i<n;i++)
{if(p1->number!=p3->number) p3=p3->next;
else
{printf("学号重复,请重输!\n");
goto repeat2;
}
}
}
}
printf("请输入学生姓名:");
scanf("%s",&p1->name);/*输入学生姓名*/
printf("请输入英语成绩(0~100):");
scanf("%f",&p1->english);
while(p1->english<0||p1->english>100)
{printf("输入错误,请重新输入英语成绩");
scanf("%f",&p1->english);
}
printf("请输入数学成绩(0~100):");
scanf("%f",&p1->math);
while(p1->math<0||p1->math>100)
{printf("输入错误,请重新输入数学成绩");
scanf("%f",&p1->math);
}
printf("请输入计算机成绩(0~100):");
scanf("%f",&p1->computer);
while(p1->computer<0||p1->computer>100)
{printf("输入错误,请重新输入计算机成绩");
scanf("%f",&p1->computer);
}
p1->sum=p1->english+p1->math+p1->computer;
p1->average=p1->sum/3;
}
end:
p2->next=NULL;/*链表结尾*/
printf("输入的学生数为:%d个!\n",n);
return(head);
}
files *load(files *head) /*函数load功能:从文件读入学生记录*/
{files *p1,*p2;
int m=n=0;
FILE *fp;
if((fp=fopen("stu.txt","r"))==NULL)
{printf("不能打开文件!\n");
return 0;
}
m=m+1;
if(m==1)
{p1=(files *)malloc(LEN); /*开辟一个新单元*/
fscanf(fp,"%f%s%f%f%f%f%f%ld",&p1->number,p1->name,&p1->english,&p1->math,&p1->computer,&p1->sum,&p1->average,&p1->rank);
head=NULL;printf("32654\n");
do
{n=n+1;
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
p1=(files *)malloc(LEN); /*开辟一个新单元*/
fscanf(fp,"%f%s%f%f%f%f%f%ld",&p1->number,p1->name,&p1->english,&p1->math,&p1->computer,&p1->sum,&p1->average,&p1->rank);
}while(!feof(fp));
p2->next=p1;
p1->next=NULL;
n=n+1;
}
fclose(fp); /*结束读入,关闭文件*/
return (head);
}
files *add(files *head,files *stu) /*函数add,功能:追加学生资料*/
{files *p0,*p1,*p2,*p3;
int i;
p1=stu=(files *)malloc(LEN);/*开辟一个新单元*/
printf("\n输入要增加的学生的资料!");
repeat4: printf("请输入学生学号(学号应大于0):");
scanf("%ld",&stu->number);
if(stu->number==0) goto end2; /*当输入的学号为0时,转到末尾,结束追加*/
else
{p3=head;
if(n>0)
{for(i=0;i<n;i++)
{if(stu->number!=p3->number) p3=p3->next;
else
{printf("学号重复,请重输!\n");
goto repeat4; /*当输入的学号已经存在,程序报错,返回前面重新输入*/
}
}
}
}
printf("输入学生姓名:");
scanf("%s",stu->name);
printf("请输入英语成绩(0~100):");
scanf("%f",&p1->english);
while(p1->english<0||p1->english>100)
{printf("输入错误,请重新输入英语成绩");
scanf("%f",&p1->english);
}
printf("请输入数学成绩(0~100):");
scanf("%f",&p1->math);
while(p1->math<0||p1->math>100)
{printf("输入错误,请重新输入数学成绩");
scanf("%f",&p1->math);
}
printf("请输入计算机成绩(0~100):");
scanf("%f",&p1->computer);
while(p1->computer<0||p1->computer>100)
{printf("输入错误,请重新输入计算机成绩");
scanf("%f",&p1->computer);
}
p1->sum=p1->english+p1->math+p1->computer;
p1->average=p1->sum/3;
p1=head;
p0=stu;
if(head==NULL)
{head=p0;
p0->next=NULL;
} /*当原来链表为空时,从首结点开始存放资料*/
else /*原来链表不为空*/
{if(p1->next==NULL) /*找到原来链表的末尾*/
{p1->next=p0;
p0->next=NULL; /*将它与新开单元相连接*/
}
else
{while(p1->next!=NULL) /*还没找到末尾,继续找*/
{p2=p1;
p1=p1->next;
}
p1->next=p0;
p0->next=NULL;
}
}
n=n+1;
p1=head;
p0=stu;
end2:
printf("现在的学生数为:%d个!\n",n);
return(head);
}
files *del(files *head) /*函数del功能:删除学生资料*/
{files *p1,*p2;
float num;
printf("输入要删除的学生的学号(输入0时退出):");
scanf("%f",&num);
while(num!=0) /*输入学号为0时退出*/
{if(head==NULL)
{printf("\n没有任何学生资料!\n");
return(head);
}
p1=head;
while(num!=p1->number&&p1->next!=NULL) /*p1指向的不是所要找的首结点,并且后面还有结点*/
{p2=p1;
p1=p1->next;
} /*p1后移一个结点*/
if(num==p1->number) /*找到了*/
{if(p1==head) head=p1->next;/*若p1指向的是首结点,把地二个结点地址赋予head*/
else p2->next=p1->next; /*否则将下一个结点地址 赋给前一结点地址*/
printf("删除:%.0f\n",num);
n=n-1;
}
else printf("%.0f不存在此学生!\n",num); /*找不到该结点*/
printf("输入要删除的学生的学号:");
scanf("%f",&num);
}
printf("已经退出了!\n");
printf("现在的学生数为:%d个!\n",n);
return(head);
}
void print(files *head) /*函数print功能:显示学生成绩*/
{
files *p;
if(head==NULL) printf("\n没有任何学生资料!\n");
else
{printf("%d\n",n);
printf("=================================================================\n");
printf("|学号\t|姓名\t|英语\t|数学\t|计算机\t|总分\t|平均分\t|名次\n");
printf("=================================================================\n"); /*打印表格域*/
p=head;
do
{printf("|%.0f\t|%s\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|%ld\t|\n",p->number,p->name,p->english,p->math,p->computer,p->sum,p->average,p->rank);
printf("=================================================================\n"); /*打印表格域*/
p=p->next;
}while (p!=NULL); /*打印完成了*/
}
getchar();
}
void search(files *head) /*函数search功能:查询学生成绩*/
{float num;
char na[20];
int i;
files *p1,*p2;
printf("输入要查询的学生的1.学号\t2.姓名\t0.推出:");
printf("\n请选择:");
scanf("%f",&i);
if(i==1) {printf("输入学号:");
scanf("%d",&num);
while(num!=0)
{if(head==NULL) printf("\n没有任何学生资料!\n");
printf("=================================================================\n");
printf("|学号\t|姓名\t|英语\t|数学\t|计算机\t|总分\t|平均分\t|名次\n");
printf("=================================================================\n"); /*打印表格域*/
p1=head;
while(num!=p1->number&&p1->next!=NULL)
{p2=p1;
p1=p1->next;
}
if(num==p1->number)
printf("|%.0f\t|%s\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|%ld\t|\n",p1->number,p1->name,p1->english,p1->math,p1->computer,p1->sum,p1->average,p1->rank);
else printf("%.0f不存在此学生!\n",num);
printf("输入要查询的学生的学号,");
scanf("%f",&num);
}
printf("已经退出了!\n");
}
else if(i==2) {printf("输入姓名,输#推出:");
scanf("%s",na);
while(strcmp(na,"#")!=0)
{if(head==NULL) printf("\n没有任何学生资料!\n");
printf("=================================================================\n");
printf("|学号\t|姓名\t|英语\t|数学\t|计算机\t|总分\t|平均分\t|名次\n");
printf("=================================================================\n"); /*打印表格域*/
p1=head;
while((strcmp(na,p1->name)!=0)&&p1->next!=NULL)
{p2=p1;
p1=p1->next;
}
if(strcmp(na,p1->name)==0)
printf("|%.0f\t|%s\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|%ld\t|\n",p1->number,p1->name,p1->english,p1->math,p1->computer,p1->sum,p1->average,p1->rank);
else printf("%s不存在此学生!\n",na);
printf("输入要查询的学生的学号,");
scanf("%s",na);
}
printf("已经退出了!\n");
}
else if(i==0) printf("推出!\n");
}