#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <malloc.h>
typedef struct student
{
char name[10];
char schoolid[10];
char classid[10];
int grade_1;
int grade_2;
int grade_3;
int grade_4;
int grade_5;
int grade_6;
int grade_7;
int grade_8;
int grade_9;
int grade_10;
int avergrade;
struct student *next;
}stu;
void creatstu(stu *&L)
{
L = (stu *)malloc(sizeof(stu));
L->next = NULL;
}
void input_1(stu *&L)
{
stu *p,*q=L;//新–尾结点指针;
char flag[10];
while (1)
{
printf("(提示:输入‘no’返回主菜单!)\n");
printf(“姓名:”);
scanf("%s", flag);
if (strcmp(flag, “no”) == 0)
{
break;
}
p = (stu *)malloc(sizeof(stu));
strcpy(p->name,flag);
//p->name = flag;
printf("\n");
printf(“学号:”);
scanf("%s", &p->schoolid);
printf("\n");
printf(“班号:”);
scanf("%s", &p->classid);
printf("\n");
printf(“请选择输入10次成绩的方式:[1]顺序一次性输入 [2]自定义输入\n”);
int sel;
scanf("%d",&sel);
switch(sel)
{
case 1:
printf("第一次成绩:");
scanf("%d",&p->grade_1);
printf("\n");
printf("第二次成绩:");
scanf("%d",&p->grade_2);
printf("\n");
printf("第三次成绩:");
scanf("%d",&p->grade_3);
printf("\n");
printf("第四次成绩:");
scanf("%d",&p->grade_4);
printf("\n");
printf("第五次成绩:");
scanf("%d",&p->grade_5);
printf("\n");
printf("第六次成绩:");
scanf("%d",&p->grade_6);
printf("\n");
printf("第七次成绩:");
scanf("%d",&p->grade_7);
printf("\n");
printf("第八次成绩:");
scanf("%d",&p->grade_8);
printf("\n");
printf("第九次成绩:");
scanf("%d",&p->grade_9);
printf("\n");
printf("第十次成绩:");
scanf("%d",&p->grade_10);
printf("\n");
break;
case 2 :
while(1)
{
int i;
printf("请选择输入第几次的成绩(1~10):");
scanf("%d",&i);
switch(i)
{
case 1:
scanf("%d",&p->grade_1);break;
case 2:
scanf("%d",&p->grade_2);break;
case 3:
scanf("%d",&p->grade_3);break;
case 4:
scanf("%d",&p->grade_4);break;
case 5:
scanf("%d",&p->grade_5);break;
case 6:
scanf("%d",&p->grade_6);break;
case 7:
scanf("%d",&p->grade_7);break;
case 8:
scanf("%d",&p->grade_8);break;
case 9:
scanf("%d",&p->grade_9);break;
case 10:
scanf("%d",&p->grade_10);break;
default:
printf("输入错误!\n");break;
}
printf("按’n‘退出 !\n");
char flag;
scanf("%c",&flag);
if(flag == 'n'){break;}
}
printf("请确认十次成绩是否都已录入?未录入的成绩会被初始化值为“0”!\n");
break;
}
printf("成绩已录入!\n");
printf("平均分根据平时十次成绩自动计算!\n");
printf("平均分:");
p->avergrade = (p->grade_1+p->grade_2+p->grade_3+p->grade_4+p->grade_5+
p->grade_6+p->grade_7+p->grade_8+p->grade_9+p->grade_10)/10;
printf("%d\n", p->avergrade);
printf("您已经完成一条记录的添加!\n");
p->next=q->next;
q->next=p;
q=p;
}
}
int check(stu *L,char a[])
{
stu *p = L->next;
int i,sel;
while(pNULL)
{
printf(“无信息可供查询!\n”);
break;
}
printf(“查找学生的信息\n”);
printf("=======================================================\n");
printf("!! !!\n");
printf("!! 请输入序号选择以下操作: !!\n");
printf("!! [0]退出! !!\n");
printf("!! [1]通过学号查询 !!\n");
printf("!! [2]通过姓名查询 !!\n");
printf("!! [3]通过班号查询 !!\n");
printf("!! !!\n");
printf("\n\n");
scanf("%d",&sel);printf("\n");
switch(sel)
{
case 0:
break;
case 1:
char flag[10];
printf("输入待查询学号:");
scanf("%s",&flag);
printf("\n");
while(p!=NULL)
{
if(strcmp(p->schoolid,flag)==0)
{
printf("该学生信息如下:\n");
printf("!! 学号:%s !!\n",p->schoolid);
printf("!! 班号:%s !!\n",p->classid);
printf("!! 姓名:%s !!\n",p->name);
printf("!! 成绩[1]:%d !!\n",p->grade_1);
printf("!! 成绩[2]:%d !!\n",p->grade_2);
printf("!! 成绩[3]:%d !!\n",p->grade_3);
printf("!! 成绩[4]:%d !!\n",p->grade_4);
printf("!! 成绩[5]:%d !!\n",p->grade_5);
printf("!! 成绩[6]:%d !!\n",p->grade_6);
printf("!! 成绩[7]:%d !!\n",p->grade_7);
printf("!! 成绩[8]:%d !!\n",p->grade_8);
printf("!! 成绩[9]:%d !!\n",p->grade_9);
printf("!! 成绩[10]:%d !!\n",p->grade_10);
printf("!! 平均分:%d !!\n",p->avergrade);
printf("***************************\n");
break;
}
else
{
p = p->next;
}
};break;
case 2:
printf("输入待查询姓名:");
scanf("%s",&flag);printf("\n");
while(p!=NULL)
{
if(strcmp(p->name,flag)==0)
{
printf("该学生信息如下:\n");
printf("!! 学号:%s !!\n",p->schoolid);
printf("!! 班号:%s !!\n",p->classid);
printf("!! 姓名:%s !!\n",p->name);
printf("!! 成绩[1]:%d !!\n",p->grade_1);
printf("!! 成绩[2]:%d !!\n",p->grade_2);
printf("!! 成绩[3]:%d !!\n",p->grade_3);
printf("!! 成绩[4]:%d !!\n",p->grade_4);
printf("!! 成绩[5]:%d !!\n",p->grade_5);
printf("!! 成绩[6]:%d !!\n",p->grade_6);
printf("!! 成绩[7]:%d !!\n",p->grade_7);
printf("!! 成绩[8]:%d !!\n",p->grade_8);
printf("!! 成绩[9]:%d !!\n",p->grade_9);
printf("!! 成绩[10]:%d !!\n",p->grade_10);
printf("!! 平均分:%d !!\n",p->avergrade);
printf("***************************\n");
break;
}
else
{
p = p->next;
}
};break;
case 3:
printf("输入待查询班号:");
scanf("%s",&flag);printf("\n");
while(p!=NULL)
{
if(strcmp(p->classid,flag)==0)
{
printf("***************************\n");
printf("该学生信息如下:\n");
printf("!! 学号:%s !!\n",p->schoolid);
printf("!! 班号:%s !!\n",p->classid);
printf("!! 姓名:%s !!\n",p->name);
printf("!! 成绩[1]:%d !!\n",p->grade_1);
printf("!! 成绩[2]:%d !!\n",p->grade_2);
printf("!! 成绩[3]:%d !!\n",p->grade_3);
printf("!! 成绩[4]:%d !!\n",p->grade_4);
printf("!! 成绩[5]:%d !!\n",p->grade_5);
printf("!! 成绩[6]:%d !!\n",p->grade_6);
printf("!! 成绩[7]:%d !!\n",p->grade_7);
printf("!! 成绩[8]:%d !!\n",p->grade_8);
printf("!! 成绩[9]:%d !!\n",p->grade_9);
printf("!! 成绩[10]:%d !!\n",p->grade_10);
printf("!! 平均分:%d !!\n",p->avergrade);
printf("***************************\n");
break;
}
else
{
p = p->next;
}
};break;
default:
printf("输入错误!\n");
printf("***************************\n");
break;
}
}
int del(stu *&L,char sch_id)
{
stu *p = L->next,*q = L,*temp;//定义q为p的前驱节点
temp = q;
char flag[10];
if (p == NULL)
{
printf(“提示:没有学生信息可以删除!\n\n “);
return 0;
}
printf(” \n提示:请输入待删除学生的学号!\n “);
scanf(”%s”, &flag);
while (p!= NULL)
{
if (strcmp(p->schoolid,flag)==0)
{
break;
}
temp = q;
q = q->next;
}
if (p!=NULL)
{
p = q->next;
q->next = p->next;
printf("已删除该学生信息!\n");
printf("**************************************\n");
}
}
void scan_1(stu *&L)
{
stu *p = L->next;
if(p!=NULL)
{
while(p!=NULL)
{
printf(“所有学生信息如下:\n”);
printf(“学号:%s\n”,p->schoolid);
printf(“班号:%s\n”,p->classid);
printf(“姓名:%s\n”,p->name);
printf(“平均分:%d\n”,p->avergrade);
printf("------------------------------\n");
p = p->next;
}
}
else
{printf(“无信息!\n”);printf("-------------------------------------\n\n");}
}
void scan(stu *&L)
{
stu *p = L->next;
if(p!=NULL)
{
while(p!=NULL)
{
printf("------------------------------\n");
printf("!! 所有学生信息如下: !!\n");
printf("!!学号:%s !!\n",p->schoolid);
printf("!!班号:%s !!\n",p->classid);
printf("!!姓名:%s !!\n",p->name);
printf("!!成绩[1]:%d !!\n",p->grade_1);
printf("!!成绩[2]:%d !!\n",p->grade_2);
printf("!!成绩[3]:%d !!\n",p->grade_3);
printf("!!成绩[4]:%d !!\n",p->grade_4);
printf("!!成绩[5]:%d !!\n",p->grade_5);
printf("!!成绩[6]:%d !!\n",p->grade_6);
printf("!!成绩[7]:%d !!\n",p->grade_7);
printf("!!成绩[8]:%d !!\n",p->grade_8);
printf("!!成绩[9]:%d !!\n",p->grade_9);
printf("!!成绩[10]:%d !!\n",p->grade_10);
printf("!!平均分:%d !!\n",p->avergrade);
printf("------------------------------");
printf("------------------------------\n");
p = p->next;
}
}
else
{printf(“无信息!\n”);printf("-------------------------------------\n\n");}
}
int sortstu(stu *&L)
{
stu *p = L->next,*pre,*cur,*tail = NULL,*flag = NULL;//定义前驱pre,后驱cur节点,尾结点tail;
int temp;
if (NULL == L)
{
return 0;
}
else
{
//因为flag是记录最后一次发生交换的两个节点的前一个结点,理论上如果flag与L相等,
//那么就说明链表只是最开始的两个结点是无序的,那么第一次排序完成就不再排序,或者是第二种情况,flag
//被置为L,要是第一趟排序完成,flag仍为L,就说明没有发生交换,那么就不再进行排序
while (flag != L)
{
tail = flag;
flag = L;
pre = L;
while (pre->next != tail)
{
cur = pre->next;
if (pre->avergrade > cur->avergrade)
{
temp = pre->avergrade;
pre->avergrade = cur->avergrade;
cur->avergrade = temp;
flag = pre->next;
}
pre = pre->next;
}
}
scan_1(L);
}
}
int change(stu *&L,char a[])
{
char flag[10];
stu *p = L->next;
int i;
printf(“修改学生的记录!\n”);
printf(“通过学生姓名,学号或者班号修改信息!\n”);
printf("=========================================================\n");
printf("!! !!\n");
printf("!! 请输入序号选择以下操作: !!\n");
printf("!! [0]退出! !!\n");
printf("!! [1]通过姓名查询 !!\n");
printf("!! [2]通过学号查询 !!\n");
printf("!! [3]通过班号查询 !!\n");
printf("!! !!\n");
printf("\n\n");
int sel;
scanf("%d",&sel);
switch(sel)
{
case 0:break;
case 1:
printf(“请输入待修改的学生的姓名:”);
scanf("%s",&flag);
while(p!=NULL)
{
if(strcmp(p->name,flag)==0)
{
printf(“修改姓名:”);
scanf("%s",&p->name);
printf(“修改学号:”);
scanf("%s",&p->schoolid);
printf(“修改班号:”);
scanf("%s",&p->classid);
printf(“信息修改成功!\n”);
}break;
}
printf(“没有此学生信息!\n”);
printf("**************************\n");break;
case 2:
printf("请输入待修改的学生的学号:");
scanf("%s",&flag);
while(p!=NULL)
{
if(strcmp(p->schoolid,flag)==0)
{
printf("修改姓名:");
scanf("%s",&p->name);
printf("修改学号:");
scanf("%s",&p->schoolid);
printf("修改班号:");
scanf("%s",&p->classid);
printf("信息修改成功!\n");
}break;
}
printf("没有此学生信息!\n");
printf("**************************\n");break;
case 3:
printf("请输入待修改的学生班号:");
scanf("%s",&flag);
while(p!=NULL)
{
if(strcmp(p->classid,flag)==0)
{
printf("修改姓名:");
scanf("%s",&p->name);
printf("修改学号:");
scanf("%s",&p->schoolid);
printf("修改班号:");
scanf("%s",&p->classid);
printf("信息修改成功!\n");
}break;
}
printf("没有此学生信息!\n");
printf("**************************\n");break;
}
}
int main()
{
stu G;
G.grade_1 = 0;
G.grade_2 = 0;
G.grade_3 = 0;
G.grade_4 = 0;
G.grade_5 = 0;
G.grade_6 = 0;
G.grade_7 = 0;
G.grade_9 = 0;
G.grade_10 = 0;
stu L;
creatstu(L);
int flag;
while(1)
{
printf("\n");
printf("!! 欢迎使用学生作业管理系统 !!\n");
printf("!! !!\n");
printf("!! 请输入序号选择以下操作: !!\n");
printf("!! [0]退出系统,谢谢使用! !!\n");
printf("!! [1]添加学生信息 !!\n");
printf("!! [2]修改学生信息 !!\n");
printf("!! [3]浏览所有学生信息 !!\n");
printf("!! [4]指定查看学生信息 !!\n");
printf("!! [5]输入学号删除学生全部信息 !!\n");
printf("!! [6]学生平均分升序排列 !!\n");
printf("!! !!\n");
printf("\n\n");
printf(“请输入:”);
scanf("%d", &flag);
switch (flag)
{
case 0: printf(" \n提示:按’0’退出系统!\n "); break;
case 1: input_1(L); break; //添加学生信息
case 2: change(L,L->name); break; //修改学生信息
case 3: scan(L); break; //显示学生信息
case 4: check(L,L->name); break; //查询学生信息
case 5: del(L,*L->schoolid);break;
case 6: sortstu(L);break; //平均分升序排列
default: printf(“提示:输入错误!\n “);printf(”//\n”);
}
}
}