/*为什么我的这个成绩管理系统 只要有两个人的成绩以后 再次使用add函数就不能添加了学生了*/
#include <stdlib.h>
#include<conio.h>
#include<string.h>
struct student
{
int number;
char name[20];
int score;
struct student *next;
}*head=NULL;
int N=0;
int couting(struct student *head);
struct student *creat();
void change(struct student *head);
void search(struct student *head);
//void add(struct student* head);
void add(void);
void delect(struct student *head);
void printlist(struct student *head);
void sort(struct student *head);
void login();
void select();
void menu();
int main()
{
login();
menu();
select();
return 0;
}
//创建链表(创建学生的信息)
struct student *creat()
{
printf("你想创建几个节点");
int n;
scanf("%d",&n);
struct student *head,*node,*end;
head=(struct student *)malloc(sizeof(struct student));
end=head;
while(0<n)
{
node=(struct student*)malloc(sizeof(struct student));
printf("请输入学生的学号,姓名和 ,成绩\n");
scanf("%d%s%d",&node->number,node->name,&node->score);
end->next=node;
end=node;
n--;
system("cls");
}
end->next=NULL;
return head;
};
//修改学生的信息
void change(struct student *head)
{
char key;
if(head==NULL)
{
printf("还没有学生数据,必须手动添加,按任意键返回主菜单\n");
getchar();
return ;
}
while(1)
{
char named[20];
printf("请输入你想修改的学生的名字\n");
scanf("%s",named);
struct student *p1=head->next;
while(strcmp(p1->name,named)!=0&&p1->next!=NULL)
{
p1=p1->next;
}
if(strcmp(p1->name,named)==0)
{
printf("这个学生的信息是\n");
printf("%d\t%s\t%d\t\n",p1->number,p1->name,p1->score);
printf("请输入你想修改的学生的信息,学号,姓名,和成绩\n");
scanf("%d%s%d",&p1->number,p1->name,&p1->score);
printf("修改成功是否继续 yes or no\n");
setbuf(stdin,NULL);
scanf("%c",&key);
if(key=='Y'||key=='y')
{
change(head);
}
else
{
break;
}
}
else
{
printf("你输入的学生不存在,请重新查找");
getch();
system("cls");
}
}
};
//查找学生的信息,并且输出
void search(struct student *head)
{
if(head==NULL)
{
printf("还没有学生数据必须手动添加,按任意键返回主菜单");
getchar();
return ;
}
char key;
char named[20];
while(1)
{
printf("请输入你想查找的学生的姓名\n");
struct student *p1=head->next;
scanf("%s",named);
while(p1->name!=named&&p1->next!=NULL)
{
p1=p1->next;
}
if(p1->name==named)
{
printf("你想查找的学生的信息是\n");
printf("%d%s%d\n",p1->number,p1->name,p1->score);
printf("是否继续 yes or no\n");
setbuf(stdin,NULL);
scanf("%c",&key);
if(key=='Y'||key=='y')
{
search(head);
}
else
{
break;
}
}
else
{
printf("找不到该学生,请重新查找");
getch();
system("cls");
}
}
};
//增加一个学生
//void add(struct student* head)
void add(void)
{
int n;
char key;
if(head==NULL)
{
struct student *p2=(struct student *)malloc(sizeof(struct student));
if(p2 == NULL)
{
printf("申请内存空间失败!\n");
exit(1);
}
printf("还没有学生的任何信息,是否手动添加一个Y or N");
setbuf(stdin,NULL);
scanf("%c",&key);
if(key=='y'||key=='Y')
{
//struct student *head=(struct student *)malloc(sizeof(struct student));
head=(struct student *)malloc(sizeof(struct student));
if(head == NULL)
{
printf("申请内存空间失败!\n");
exit(1);
}
printf("请输入该学生的信息,依次为学号,姓名,成绩\n");
setbuf(stdin,NULL);
scanf("%d%s%d",&p2->number,p2->name,&p2->score);
head->next=p2;
p2->next=NULL;
printf("插入完毕是否继续插入Y/N");
setbuf(stdin,NULL);
scanf("%c",&key);
if(key=='y'||key=='Y')
{
//add(head);
add();
}
else
{
printf("按任意键返回主菜单\n");
setbuf(stdin,NULL);
getchar();
//free(p2);
return;
}
}
else
{
printf("按回车键返回主菜单\n");
setbuf(stdin,NULL);
getchar();
//free(p2);
return;
}
}
struct student *p3=(struct student *)malloc(sizeof(struct student));
struct student *p1=head;
struct student *p2;
printf("你想在哪里增加节点的信息\n");
scanf("%d",&n);
if(n<=0)
{
printf("输入错误,按任意键返回菜单");
setbuf(stdin,NULL);
getchar();
return ;
}
for(int i=0;i<n;i++)
{
N=couting(head);
p2=p1;
p1=p1->next;
if(p1->next==NULL&&i==0)
{
printf("这个链表只有一个学生,是否插在这个这个学生之前y or n\n");
setbuf(stdin,NULL);
scanf("%c",&key);
if(key=='y'||key=='Y')
{
printf("请输入该学生的信息,依次为学号\t,姓名\t,成绩\n");
scanf("%d%s%d",&p3->number,p3->name,&p3->score);
p3->next=head->next;
head->next=p3;
printf("插入完毕,是否继续 Y or N");
setbuf(stdin,NULL);
scanf("%c",&key);
if(key=='Y'||key=='y')
{
//add(head);
add();
}
else
{
printf("按任意键返回");
setbuf(stdin,NULL);
getchar();
return ;
}
}
printf("是否愿意插在这个学生之后呢y or N");
setbuf(stdin,NULL);
scanf("%c",&key);
if(key=='y'||key=='Y')
{
printf("请输入该学生的信息,依次为学号,姓名,成绩\n");
scanf("%d%s%d",&p3->number,p3->name,&p3->score);
p1->next=p3;
p3->next=NULL;
printf("插入完毕是否继续 Y OR N\n");
setbuf(stdin,NULL);
scanf("%c",&key);
if(key=='Y'||key=='y')
{
//add(head);
add();
}
else
{
printf("按任意键返回");
setbuf(stdin,NULL);
getchar();
return ;
}
}
else
{
printf("按任意键返回");
setbuf(stdin,NULL);
getchar();
return ;
}
}
if(N==n&&p1->next==NULL)
{
printf("您输入的位数恰好是倒数第二个节点,是否进行插入 y or n\n");
setbuf(stdin,NULL);
scanf("%c",&key);
if(key=='y'||key=='Y')
{
printf("请依次输入该学生的学号\t姓名\t成绩\t,");
scanf("%d%s%d",&p3->number,p3->name,&p3->score);
p3->next=p2->next;
p2->next=p3;
printf("插入完毕,是否继续Y OR N\n");
setbuf(stdin,NULL);
scanf("%c",&key);
if(key=='y'||key=='Y')
{
//add(head);
add();
}
else
{
printf("按任意键返回菜单\n");
setbuf(stdin,NULL);
getchar();
return ;
}
}
else
{
printf("按任意键返回菜单\n");
setbuf(stdin,NULL);
getchar();
return ;
}
}
else
{
printf("按任意键返回主菜单\n");
setbuf(stdin,NULL);
getchar();
return ;
}
if(p1==NULL)
{
printf("您输入的位数太多,只能插在最后一个节点\n");
printf("是否进行插入 y or Y\n");
setbuf(stdin,NULL);
scanf("%c",&key);
if(key=='y'||key=='Y')
{
printf("请输入这个学生的各项信息,依次为学号姓名成绩\n");
scanf("%d%s%d",&p3->number,p3->name,&p3->score);
p1->next=p3;
p3->next=NULL;
printf("插入完毕,是否继续");
setbuf(stdin,NULL);
scanf("%c",&key);
if(key=='y'||key=='Y')
{
//add(head);
add();
}
else
{
printf("按任意键返回主菜单");
setbuf(stdin,NULL);
getchar();
return ;
}
}
else
{
printf("按任意键返回菜单\n");
setbuf(stdin,NULL);
getchar();
return ;
}
}
}
if(p1->next!=NULL)
{
printf("请输入你插入的这个学生的信息,依次为学号\t姓名\t成绩\n");
scanf("%d%s%d",&p3->number,p3->name,&p3->score);
p3->next=p2->next;
p2->next=p3;
printf("插入完毕,按任意键返回\n");
setbuf(stdin,NULL);
getch();
return ;
}
else
{
printf("666");
setbuf(stdin,NULL);
getchar();
}
};
//删除学生的信息
void delect(struct student *head)
{
if(head==NULL)
{
printf("还没有学生数据,必须手动添加,按任意键返回主菜单\n");
getchar();
return ;
}
char key;
if(head->next==NULL)
{
printf("请返回菜单进行学生信息插入");
getchar();
return ;
}
char names[20];
printf("请输入你查找的学生的名字\n");
scanf("%s",names);
struct student *p1=head->next,*p2=head;
while(strcmp(p1->name,names)!=0)
{
p2=p1;
p1=p1->next;
if(p1->next==NULL&&strcmp(p1->name,names)==0)
{
printf("你要删除的学生是最后一个节点,是否进行删除y/n");
setbuf(stdin,NULL);
scanf("%c",&key);
if(key=='Y'||key=='y')
{
free(p1);
p2->next=NULL;
printf("已删除该学生\n");
getchar();
return ;
}
else
{
printf("按任意键返回");
getchar();
return ;
}
}
if(p1->next==NULL&&strcmp(p1->name,names)!=0)
{
printf("找不到该学生,请按任意键返回");
getchar();
return ;
}
}
if(strcmp(p1->name,names)==0)
{
if(p1->next==NULL)
{
printf("这是这个链表的唯一一个学生数据是否进行删除Y/N");
setbuf(stdin,NULL);
scanf("%c",&key);
if(key=='y'||key=='Y')
{
free(p1);
head==NULL;
}
else
{
printf("按任意键返回\n");
getchar();
return ;
}
}
printf("找到该学生,是否现在删除该学生的信息\n(y/n)");
setbuf(stdin,NULL);
scanf("%c",&key);
if(key=='y'||key=='Y')
{
p2->next=p1->next;
free(p1);
printf("已删除该学生信息,是否继续 yes or no(y/n)");
setbuf(stdin,NULL);
scanf("%c",&key);
if(key=='y'||key=='Y')
{
delect(head);
}
else
{
return ;
}
}
else
{
printf("按任意键返回\n");
getchar();
return ;
}
}
};
//遍历链表,打印所有学生信息
void printlist(struct student *head)
{
if(head->next==NULL)
{
printf("还没有录入学生信息,请按任意键返回菜单进行插入");
getchar();
return ;
}
int n;
struct student *p1=(head->next);
printf("你想打印多少个学生的信息\n");
scanf("%d",&n);
if(n==0)
{
printf("输入错误,按任意键返回菜单");
setbuf(stdin,NULL);
getchar();
return ;
}
for(int i=0; i<n; i++)
{
printf("学号%d\t姓名%s\t成绩%d\n",p1->number,p1->name,p1->score);
p1=p1->next;
if(p1==NULL)
{
break;
}
}
printf("打印完毕按任意键返回");
getchar();
}
void sort(struct student *head)
{
char demo[20];
if(head->next==NULL)
{
printf("占时还无学生数据,必须添加,按任意键返回主菜单");
getchar();
return ;
}
int i,j,temp,n;
printf("你想对几个学生的成绩进行排序\n");
scanf("%d",&n);
for(i=1; i<n; i++)
{
struct student *p1=head->next,*p2=p1->next;
for(j=i; j<n; j++)
{
if(p1->score<p2->score)
{
temp=p1->score;
p1->score=p2->score;
p2->score=temp;
temp=p1->number;
p1->number=p2->number;
p2->number=temp;
strcpy(demo,p1->name);
strcpy(p1->name,p2->name);
strcpy(p2->name,demo);
}
if(p2->next==NULL)
{
break;
}
p1=p1->next;
p2=p2->next;
}
}
printf("这些排序后的成绩是\n");
printlist(head);
getchar();
return ;
}
void menu()
{
printf("1录入学生成绩\n");
printf("2添加学生信息\n");
printf("3修改学生信息\n");
printf("4删除学生信息\n");
printf("5打印学生信息\n");
printf("6对学生成绩进行排名\n");
}
void login()
{
int i=3;
int j=0;
char nameme[20],passward[20];
while(i)
{
printf("欢迎来到学生成绩管理系统\n");
printf("请输入用户名\n");
scanf("%s",nameme);
printf("请输入密码\n");
while(1)
{
passward[j]=getch();
if(passward[j]=='\r')
{
passward[j]='\0';
break;
}
j++;
printf("*");
}
if(strcmp(nameme,"1")==0&&strcmp(passward,"1")==0)
{
printf("登陆成功\n");
printf("请选择你想要的功能\n");
break;
}
else
{
printf("登陆失败,请重新输入,你还有%d次机会\n",i);
system("pause");
i--;
getchar();
system("cls");
if(i==0)
{
printf("您输入的错误次数过多,按任意键,退出系统\n");
getchar();
exit(0);
}
}
}
}
int couting(struct student *head)
{
struct student *p1=head;
while(p1->next!=NULL)
{
N++;
p1=p1->next;
}
return N;
}
void select()
{
int demo;
scanf("%d",&demo);
switch(demo)
{
case 1:
head=creat();
printf("按任意键返回\n");
setbuf(stdin,NULL);
getch();
system("cls");
menu();
select();
case 2:
//add(head);
add();
printf("按任意键返回\n");
setbuf(stdin,NULL);
getch();
system("cls");
menu();
select();
case 3:
change(head);
printf("按任意键返回\n");
setbuf(stdin,NULL);
getchar();
system("cls");
menu();
select();
case 4:
delect(head);
printf("按任意键返回\n");
setbuf(stdin,NULL);
getch();
system("cls");
menu();
select();
case 5:
printlist(head);
printf("按任意键返回\n");
setbuf(stdin,NULL);
getch();
system("cls");
menu();
select();
case 6:
sort(head);
printf("按任意键返回\n");
setbuf(stdin,NULL);
getch();
system("cls");
menu();
select();
}
}
04-27