#include
#include
#include
#define LEN sizeof(STUDENT) //定义STUDENT所占内存空间大小的全局变量
//声明一个 STUDENT 学生的结构体,这个结构体包含学生的各个属性,如得分、姓名、成绩总和等
typedef struct stu
{
int score;
int sum;
char name[5];
char colname[6];
char proname[6];
char stunum[3];
char pronum[3];
struct stu *NEXT;
}STUDENT;
STUDENT *head,New;//定义指针变量STUDENT
STUDENT *current;//定义当前指针变量Student
//初始化,程序开始时调用
STUDENT *Init()
{
return NULL;
}
//进入菜单,让用户进行输入,根据输入的值执行不同的功能
int MENU()
{
int v;
printf("1. 输入运动员成绩\n");
printf("2. 查询\n");
printf("3. 保存\n");
printf("4. 读取\n");
printf("5. 退出\n");
do
{
printf("输入你的选择:");
fflush(stdin);
scanf("%d",&v); //将输入的值保持到变量v中,
}while(v<1||v>5);//do
while:如果输入的值v小于1大于5,则让用户重新输入
return(v); //输入符合要求 返回v的值
}
STUDENT *ADD()//添加新的记录
{
int i; //
STUDENT *next=NULL,*p;
p=(STUDENT *)malloc(LEN);
//申请分配STUDENT长度的内存空间,并强制转换成STUDENT类型,让指针p指向刚刚申请的内存空间
if(!p) //如果内存不够,则输出error
{
printf("错误!\n");
return(head); //将指向空的STUDENT指针head返回
}
printf("输入学院名称:"); //输入信息
scanf("%s",p->colname);
printf("输入选手姓名:");
scanf("%s",p->name);
printf("输入选手编号:");
scanf("%s",p->stunum);
printf("输入项目名称:");
scanf("%s",p->proname);
printf("输入项目代号:");
scanf("%s",p->pronum);
printf("输入选手得分:");
do
{
scanf("%d",&i); //将输入的值保持到变量v中,
if(i<0||i>=6){
printf("输入错误!\n");
}
}while(i<0||i>=6);//输入该选手的得分,如果值大于0、小于6,则符合条件,跳出循环
p->score=i; //将成绩赋给p
p->sum=p->score;
//设置总分,即score
if(head!=NULL){ //如果head为null,则说明添加的是第一条数据
current->NEXT=p;
//head不为null的情况,让当前的指针current的下一个指向新产生的p
current=p; //当前的指针current向下移一位,指向最新的p
if(head->NEXT==NULL){
//如果head的Next,即下一个指针为null,
head->NEXT=current;
//则让heade的Next指向当前的指针,形成链
}
current->NEXT=NULL;
}else{ //head为null的情况下
head=p; //将最新生成的p赋给head,head即为链头
current=head; //当前指针指向head
current->NEXT=NULL;
}
return(head);
}
void SEARCH(STUDENT *head) //用户可以查询各个院系或个人的比赛成绩
{
STUDENT *p; //定义STUDENT的指针P
char s[5];
printf("请输入姓名查找:\n");
scanf("%s",s); //输入要查询的用户名
p=head; //让指针p指向头指针head
while(p!=NULL&&strcmp(p->name,s))
//比较当前指针p指向的学生和输入查询的学生名称是否一样,如果一样,则返回值为0,即false,则跳出循环
{
p=p->NEXT; //当前指针p指向p所指向的下一个Student
}
if(p!=NULL) //如果p不为空,即存在该学生,则输出该学生的信息
{
printf("| colname | name | stunum | proname | pronum | score |
sum |\n");
printf("| %4s | %4s | %4s | %4s | %4s | M | M |\n",
p->colname,p->name,p->stunum,p->proname,p->pronum,p->score,p->sum);
}else{//否则输出该学生不存在
printf("该学生不存在\n\n");
}
}
void SAVE(STUDENT *head)
{
FILE *fp1; //定义文件指针
STUDENT *p; //定义学生Student指针变量p
printf("保存...\n");
fp1=fopen("C:\\studentInfo.ch","w"); //将文件保存到c盘目录下
新建一个文件,拥有往这个文件写的权限
p=head; //让指针p指向head指针,即链表的第一条数据
while(p!= NULL) //如果指针不为空,则循环
{
//往fp1文件内将p写入到文件fp1中
fprintf(fp1,"| %4s | %4s | %4s | %4s | %4s | M | M
|\n",p->colname,p->name,p->stunum,p->proname,p->pronum,p->score,p->sum);
p=p->NEXT; //让当前指针指向下一个指针
}
printf("保存成功!\n");
fprintf(fp1,"abc");
fclose(fp1); //关闭这个文件
}
STUDENT *READ()
{
STUDENT *p1,*p2,*head=NULL;
FILE *fp;
char infile[10];
printf("导入文件:");
scanf("%s",infile);
printf("Reading...\n");
p1=(STUDENT *)malloc(LEN);
if(!p1)
{
printf("Error!\n");
return(head);
}
head=p1;
while(!feof(fp))
{
if(fread(p1,LEN,1,fp)!=1)
break;
p1->NEXT=(STUDENT *)malloc(LEN);
if(!p1->NEXT)
{
printf("Error!\n");
return(head);
}
p2=p1;
p1=p1->NEXT;
}
p2->NEXT=NULL;
fclose(fp);
printf("Successfully!");
return (head);
}
int main()//主函数
{
head=Init(); //初始化,为STUDENT类型的指针变量初始化值
for(;;) //通过循环让用户选择操作
{
switch(MENU())
//调用MENU()函数,让用户选择要执行什么操作,通过返回的值,switch执行不同的方法
{
case 1:head=ADD();//当MENU()函数返回值为1的时候,则调用 输入运动员成绩的方法
break;
case 2:SEARCH(head);//当MENU()函数返回值为2的时候,则调用 查询的方法
break;
case 3:SAVE(head);//当MENU()函数返回值为3的时候,则调用 保存的方法
break;
case 4:head=READ();//当MENU()函数返回值为4的时候,则调用 读取数据的方法
break;
case 5:exit(0);//当MENU()函数返回值为0的时候,则退出,退出后不再循环
}
}
return 0;
}