#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define Length sizeof(struct student)//用来开辟空间
void find2 ();
void find1 ();
void paixu();
int n=0,m=0;//定义两个全局标量
int s,t;
struct student
{ long num;
int name;
int chinesescore;
int mathscore;
int englishscore;
struct student *next;
}*head=NULL,*p,*p1,*p2; //定义指向结构体的指针
struct student STU[100]; //定义一个数组用于读取文件到链表做中间载物
void secret()
{
char a[20];
printf("欢迎来到学生信息管理系统、进入系统前请先进行密码验证\n");
printf("请输入密码 ");
do{
gets(a); /*输入密码*/
system("cls"); /*调用库函数清屏*/
printf("对不起!您输入的密码有误\n请重新输入\n");
}while(strcmp(a,"00")!=0);
system("cls");
}
void add()// //添加学生数据的函数
{
int search_num;
struct student*q,*a;
p=head;
printf("在哪个学生后面插入信息 请输入学号\n");
scanf("%d",&search_num);
while((p!=NULL)&&(search_num!=p->num))
{
q=p;
p=p->next;
}
a=(struct student* )malloc(Length);//开辟存储空间
q->next=a;
printf("学号\t姓名\t语文\t数学\t英语\t\n");
scanf("%d\t%s\t%d\t%d\t%d",&a->num,&a->name,&a->chinesescore,&a->mathscore,&a->englishscore );
a->next=p;
}
void print()//输出链表函数
{
if(n!=0)
{
p=head; //p先指向开头
system("cls");
printf("学号 姓名 语文成绩 数学成绩 英语成绩\n");
do
{
printf("%d %s %d %d %d\n",p->num,p->name,p->chinesescore,p->mathscore,p->englishscore);
p=p->next; //p打印结束 把p指向next以判断下一个区域有没有内容
}while(p!=NULL);//p不等于空就打印出链表的数据
}
else
printf("您还没有添加数据!\n");
system("pause");
system("cls");
}
void find2 ()//查找姓名的函数
{
char a[20];
printf("请输入要查找的姓名:");
scanf("%s",&a);
p=head;
do
{
if(strcmp(a,p->name)==0)//比较链表的姓名和输入的是否一致,一致则输出
{
printf("\n信息已被找到:学号 姓名 语文成绩 数学成绩 英语成绩\n");
printf("%d %s %d %d %d\n\n",p->num,p->name,p->chinesescore,p->mathscore,p->englishscore);
}
p=p->next; ////指针指向下一个节点
}while(p!=NULL);
system("pause");
system("cls");
}
void find1()//查找学号的函数
{
long a;
printf("请输入要查找的学号:");
scanf("%d",&a);
p=head;
do
{
if(a==p->num)//比较链表的学号和输入的是否一致,一致则输出
{
printf("%d %s %d %d %d\n\n",p->num,p->name,p->chinesescore,p->mathscore,p->englishscore);
}
p=p->next; //指针指向下一个节点
}while(p!=NULL);
system("pause");
system("cls");
}
void find() //查找函数
{
if(n!=0)
{
int a;
system("cls");
printf("1.按学号查询\n2.按姓名查找\n");
scanf("%d",&a);
switch(a)
{
case 1:
find1();
system("pause");
system("cls");
break;
case 2:
find2();
system("pause");
system("cls");
break;
}
}
else
{printf("******您还没有添加数据哟!\n");system("pause");}
}
void paixu()
{
struct student *q,*l;
l=q=p=head;
char ch[20];
long i;
for(p=head;p->next!=NULL;p=p->next)
{
for(l=head,q=l->next;l->next!=NULL;l=l->next,q=q->next)
{
s= (l->chinesescore+l->mathscore+l->englishscore);
t=(q->chinesescore+q->mathscore+q->englishscore);
if(s<t)
{
i=q->num;
q->num=p->num;
p->num=i;
strcpy(ch,q->name);
strcpy(q->name,p->name);
strcpy(p->name,ch);
i=q->chinesescore;
q->chinesescore=p->chinesescore;
p->chinesescore=i;
i=q->mathscore;
q->mathscore=p->mathscore;
p->mathscore=i;
i=q->englishscore;
q->englishscore=p->englishscore;
p->englishscore=i;
}
}
}
}
void Delete()//删除函数
{
if(n!=0)
{
struct student *f,*l; //定义新的指针 f使用来指向要删除的数据用来释放内存!
char a[20];
printf("请输入要删除的姓名:");
scanf("%s",&a);
p=head;
if(strcmp(head->name,a)==0)
{f=head;head=head->next;free(f);}
else
{
do
{
if(strcmp(p->name,a)==0)
{f=p;l->next=p->next;free(f);break;}
l=p; //不满足if表示这不是要删除的那一个节点,l暂时指向p 之后p再指向下一个节点,
//如果这个是要删除的节点那么l指向这个节点的next的地址
p=p->next;
}while(p!=NULL);
}
}
else
printf("您还没有添加数据\n");
printf("数据已经被删除\n");
free(p);
system("pause"); //等待命令
system("cls");
}
void amend()//修改函数
{
if(n!=0)
{
int c;
char a[20];
printf("请输入要修改的姓名:");
scanf("%s",a);
p=head;
if(head!=NULL)
do
{
if(strcmp(a,p->name)==0)
{
printf("\n被修改人信息如下:\n学号 姓名 语文成绩 数学成绩 英语成绩\n");
printf("%d %s %d %d %d\n",p->num,p->name,p->chinesescore,p->mathscore,p->englishscore);
break;
}
else
{ printf("没有该学生");
break;
}
p=p->next; ////指针指向下一个节点
}while(p!=NULL);
printf("\n\n1.修改学号\n2.修改姓名\n3.修改语文\n4.修改数学\n5.修改英语\n6.退出修改\n\n");
printf("如果没有该学生信息请选择 6 退出修改\n");
scanf("%d",&c);
switch(c)
{
case 1:
printf("学号修改为:");
scanf("%d",&p->num);break;
case 2:
printf("姓名修改为:");
scanf("%s",p->name);break;
case 3:
printf("语文修改为:");
scanf("%d",&p->chinesescore);break;
case 4:
printf("数学修改为:");
scanf("%d",&p->mathscore);break;
case 5:
printf("英语修改为:");
scanf("%d",&p->englishscore);break;
case 6:
break;
}
printf("\n\n操作成功!\n\n");
}
else
printf("您还没有添加数据\n");
system("pause");
system("cls");
}
void save()//保存到txt文件的函数
{ FILE *fp;
p=head;
char name2[50];
printf("请输入需要储存的文件名: ");
scanf("%s", name2);
if((fp=fopen(name2,"w"))==NULL)//打开一个文件,只写,建立一个新文件
{
printf("File open error!\n");
exit(0);
}
for(p=head;p!=NULL;p=p->next) /*遍历*/
fprintf(fp,"%d %s %d %d %d\n", p->num, p->name,p->chinesescore,p->mathscore,p->englishscore);/*将学生信息写入文件*/
fclose(fp);
free(p);
printf("存储完成\n");
free(p);
system("pause");
system("cls");
}
void read() //把文件中的数据读到链表中 //读入
{
if (n == 0){
printf("请先输入一个1-6的数\n");
for (;;)
{
fflush(stdin);
if (!(scanf("%d", &n)) || n>6 || n<1)
{
printf("数字是错的,应该是1-6,请重新输入\n");
continue;
}
else
break;
}
}
m = 0;
char name1[50];
printf("请输入文件名格式为:文件名.TXT\n ");
scanf("%s", name1);
FILE * fp;
while ((fp = fopen(name1, "r")) == NULL)//打开一个name1的文件
{
printf("Can not open file,input name again!");
}
int i = 0;
while (!feof(fp))
{
p = ((struct student *)malloc(sizeof(struct student)));
fscanf(fp, "%d %s %d %d %d", &p->num, p->name,&p->chinesescore,&p->mathscore,&p->englishscore);
p->next = head;
head = p;
i++;
}
printf("读取成功\n");
fclose(fp);
}
int main()
{
system("cls");
secret();
int a=1;
while(a!=0)
{
system("cls");
printf("〓〓〓〓〓〓〓〓〓〓 ☆ 学 生 成 绩 管 理 系 统 ☆ 〓〓〓〓〓〓〓〓〓〓\n");
printf("〓〓〓〓〓〓〓〓〓★ ☆ 1.增加学生信息 ☆ ★〓〓〓〓〓〓〓〓〓\n");
printf("〓〓〓〓〓〓〓〓〓★ ☆ 2.显示全部信息 ☆ ★〓〓〓〓〓〓〓〓〓\n");
printf("〓〓〓〓〓�