charn[255];do
printf(notice);//显示提示信息
scanf("%s",n);//输入字符串
if(strlen(n)>lens)
printf("\n超出长度范围,重新输入!
\n");//进行长度校验,超过lens值重新输入
}
while(strlen(n)>lens);
strcpy(t,n);//将输入的字符串拷贝到字符串t中}
//输入分数,0<=分数<=100)
intnumberinput(char*notice)
{
intt=0;
do
{
printf(notice);//显示提示信息
scanf("%d",&t);//输入分数
if(t>100||t<0)
printf("\n分数必须在0到100之间!
\n");//进行分数校验
}
while(t>100||t<0);
returnt;
}
//增加学生记录
voidAdd(Linkl)
{
Node*p,*r,*s;//实现添加操作的临时的结构体指针变量
charch,flag=0,num[12];
r=l;
s=l->next;
system("cls");
Disp(l);//先打印出已有的学生信息while(r->next!
=NULL)
r=r->next;//将指针移至于链表最末尾,准备添加记录
while
(1)//一次可输入多条记录,直至输入学号为0的记录结点添加
操作
{
while
(1)//输入学号,保证该学号没有被使用,若输入学号为0,
则退出添加记录操作
stringinput(num,12,"\n
输入学号(按“0”返回菜单!
):
");//格式化输入学号并
检验
flag=0;if(strcmp(num,"0")==0)//输入为0,则退出添加操作,返回主界面
{
return;
}
s=l->next;
while(s)//查询该学号是否已经存在,若存在则要求重新输入一
个未被占用的学号
{if(strcmp(s->data.num,num)==0){
flag=1;break;
}s=s->next;
}
if(flag==1)//提示用户是否重新输入
{getchar();printf("=====>学号%s存在,重试?
(y/n):
",num);scanf("%c",&ch);if(ch=='y'||ch=='Y')continue;
else
return;
}
else
{break;
}
}
p=(Node*)malloc(sizeof(Node));//申请内存空间if(!
p)
{
printf("\n内存空间申请失败!
");//如没有申请到,打印提示信息return;//返回主界面
}strcpy(p->data.num,num);//将字符串num拷贝到p->data.num中
stringinput(p->data.name,15,"姓名:
");
p->data.cgrade=numberinput("计算机[0-100]:
");//输入并检验分数,分数必须在0-100之间
p->data.mgrade=numberinput("数学[0-100]:
");//输入并检验分数,分数必须在0-
100之间
p->data.egrade=numberinput("英语[0-100]:
");//输入并检验分数,分数必须在0-
100之间
p->data.total=p->data.egrade+p->data.cgrade+p->data.mgrade;//计算总分p->data.ave=(float)(p->data.total/3);//计算平均分
p->data.mingci=0;
r->next=p;//将新建的结点加入链表尾部
中
p->next=NULL;//表明这是链表的尾部结点
r=p;
saveflag=1;
}
return;
}
//按学号或姓名,查询学生记录
voidQur(Linkl)
{
intselect;//1:
按学号查,2:
按姓名查,其他:
返回主界面(菜单)
charsearchinput[20];//保存用户输入的查询内容
Node*p;
if(!
l->next)//若链表为空
{
system("cls");printf("\n=====>无此学生的记录!
\n");getchar();
return;
}
system("cls");
printf("\n=====>1按学号查询=====>2按名字查询\n");
printf("请选择[1,2]:
");
scanf("%d",&select);
if(select==1)//按学号查询
{
stringinput(searchinput,12,"请输入现有学生的学号:
");p=Locate(l,searchinput,"num");//在l中查找学号为searchinput值的节点,并返回节点的指针
if(p)
{printheader();printdata(p);printf("按任意键返回!
");
getchar();
}
else
Nofind();getchar();
}
elseif(select==2)//按姓名查询
{
stringinput(searchinput,15,"请输入现有学生的姓名:
");p=Locate(l,searchinput,"name");
if(p)
{printheader();printdata(p);
printf("按任意键返回!
");getchar();
}
else
Nofind();getchar();
}
else
Wrong();
getchar();
}
//删除学生记录:
先找到保存该学生记录的节点,然后删除该节点voidDel(Linkl)
{
intsel;
Node*p,*r;
charfindmess[20];if(!
l->next)
{
system("cls");
printf("\n=====>无此学生记录!
\n");
getchar();
return;
}system("cls");
Disp(l);
printf("\n=====>1按学号删除=====>2按姓名删除\n");
printf("请选择[1,2]:
");
scanf("%d",&sel);
if(sel==1)
{
stringinput(findmess,12,"请输入现有学生的学号:
");p=Locate(l,findmess,"num");
if(p)
{
r=l;
while(r->next!
=p)
r=r->next;
r->next=p->next;//将p所指节点从链表中去除
free(p);//释放内存空间
printf("\n=====>删除成功!
\n");
getchar();saveflag=1;
}
else
Nofind();
getchar();
}
elseif(sel==2)//先按姓名查询到该记录所在的节点
{
stringinput(findmess,15,"请输入现有学生的姓名");p=Locate(l,findmess,"name");
if(p)
{
r=l;
while(r->next!
=p)
r=r->next;
r->next=p->next;
free(p);printf("\n=====>删除成功!
\n");getchar();
saveflag=1;
}
else
Nofind();getchar();
}
else
Wrong();
getchar();
//修改学生记录。
先按输入的学号查询到该记录,然后提示用户修改学号之外的值,学号不能修改
voidModify(Linkl)
{
Node*p;
charfindmess[20];if(!
l->next)
{
system("cls");
printf("\n=====>无此学生记录!
\n");getchar();
return;
}
system("cls");
printf("修改学生记录!
");
Disp(l);
stringinput(findmess,12,"请输入现有学生的学号:
");//输入并检验该学号
//查询到该节点
//若p!
=NULL,表明已经找到该
p=Locate(l,findmess,"num");
if(p)
节点
{
printf("学号:
%s,\n",p->data.num);
printf("姓名:
%s,",p->data.name);
stringinput(p->data.name,15,"输入新的姓名:
");printf("计算机:
%d,",p->data.cgrade);
p->data.cgrade=numberinput("计算机[0-100]:
");printf("数学:
%d,",p->data.mgrade);
p->data.mgrade=numberinput("数学[0-100]:
");printf("英语:
%d,",p->data.egrade);
p->data.egrade=numberinput("英语[0-100]:
");
p->data.total=p->data.egrade+p->data.cgrade+p->data.mgrade;
p->data.ave=(float)(p->data.total/3);
p->data.mingci=0;
printf("\n=====>修改成功!
\n");
Disp(l);
saveflag=1;
else
Nofind();getchar();
//插入记录:
按学号查询到要插入的节点的位置,然后在该学号之后插入一个新节点。
voidInsert(Linkl)
{
Linkp,v,newinfo;//p指向插入位置,newinfo指新插入记录
charch,num[12],s[12];〃s[]保存插入点位置之前的学号,num[]保存输入的新记录的学号
intflag=0;
v=l->next;system("cls");
Disp(l);
while
(1)
{
stringinput(s,12,"按学号查询到要插入的节点的位置:
");
flag=0;v=l->next;
while(v)//查询该学号是否存在,flag=1表示该学号存在
{if(strcmp(v->data.num,s)==0){flag=1;break;}v=v->next;
}
if(flag==1)
break;//若学号存在,则进行插入之前的新记录的输入操作
else
{
getchar();
printf("\n=====>学号%s存在,重试?
(y/n):
",s);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{
continue;
}
else
{
return;
}
}
}
//以下新记录的输入操作与Add()相同stringinput(num,12,"请输入新的学号!
:
");v=l->next;
while(v)
{
if(strcmp(v->data.num,num)==0)
{printf("=====>Sorry,新学号:
'%s'已存在!
\n",num);printheader();
printdata(v);printf("\n");getchar();return;
}
v=v->next;
}
newinfo=(Node*)malloc(sizeof(Node));
if(!
newinfo)
{
printf("\n内存申请失败!
");//如没有申请到,打印提示信息return;//返回主界面
}
strcpy(newinfo->data.num,num);stringinput(newinfo->data.name,15,"姓名:
");newinfo->data.cgrade=numberinput("计算机[0-100]:
");newinfo->data.mgrade=numberinput("数学[0-100]:
");newinfo->data.egrade=numberinput("英语[0-100]:
");newinfo->data.total=newinfo->data.egrade+newinfo->data.cgrade+newinfo->data.mgrade;newinfo->data.ave=(float)(newinfo->data.total/3);
newinfo->data.mingci=0;newinfo->next=NULL;
saveflag=1;//在main()有对该全局变量的判断,若为1,则进行存盘操作将指针赋值给p,
因为l中的头节点的下一个节点才实际保存着学生的记录
p=l->next;
while
(1)
{if(strcmp(p->data.num,s)==0)//在链表中插入一个节点{
newinfo->next=p->next;p->next=newinfo;break;
}
p=p->next;
}
Disp(l);
printf("\n\n");getchar();
voidTongji(Linkl)
{
Node*pm,*pe,*pc,*pt;//用于指向分数最高的节点
Node*r=l->next;
intcountc=0,countm=0,counte=0;//保存三门成绩中不及格的人数fflush(stdin);
if(!
r)
{
system("cls");
printf("\n=====>无此学生记录!
\n");
getchar();
return;
}
system("cls");
Disp(l);
pm=pe=pc=pt=r;
while(r)
{
if(r->data.cgrade<60)countc++;
if(r->data.mgrade<60)countm++;
if(r->data.egrade<60)counte++;if(r->data.cgrade>=pc->data.cgrade)pc=r;
if(r->data.mgrade>=pm->data.mgrade)pm=r;if(r->data.egrade>=pe->data.egrade)pe=r;
if(r->data.total>=pt->data.total)pt=r;r=r->next;
}
printf("\n统计结果\n");
printf("计算机不及格:
%d(人)\n",countc);
printf("数学不及格:
%d(人)\n”,countm);
printf("英语不及格:
%d(人)\n”,counte);
printf("\n");
printf("总分最高分姓名:
%s分数为:
%d\n",pt->data.name,pt->data.total);
printf("英语最高分姓名:
%s分数为:
%d\n",pe->data.name,pe->data.egrade);
printf("数学最高分姓名:
%s分数为:
%d\n",pm->data.name,pm->data.mgrade);
printf("计算机最高分姓名:
%s分数为:
%d\n",pc->data.name,pc->data.cgrade);
printf("\n\n按任意键返回!
");
getchar();
}
//利用插入排序法实现单链表的按总分字段的降序排序,从高到低voidSort(Linkl)
Linkll;
}
ll=(Node*)malloc(sizeof(Node));if(!
ll)
{
printf("\n内存申请失败!
");return;
}ll->