c语言链表问题c.docx
- 文档编号:13902663
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:15
- 大小:18.12KB
c语言链表问题c.docx
《c语言链表问题c.docx》由会员分享,可在线阅读,更多相关《c语言链表问题c.docx(15页珍藏版)》请在冰点文库上搜索。
c语言链表问题c
#include
#include
typedefstructnode
{
charnum[10];
charname[10];
intscore[5];/*score[0]存数学成绩score[1]语文成绩score[2]英语成绩score[3]总分score[4]平均分*/
structnode*next;
}student;/*学生成绩结构体*/
/*初始化结构体*/
student*init(student*t)
{
t=(student*)malloc(sizeof(student));
t->next=NULL;
t->score[4]=t->score[3]=t->score[0]=t->score[1]=t->score[2]=0;
returnt;
}
/*保存数据*/
voidsave(student*stu)
{
FILE*fp;
if((fp=fopen("score1","w"))==NULL)/*为输出打开文件score1*/
{
printf("cannotopenfile\n");exit(0);
}
stu=stu->next;
while(stu!
=NULL)
{
if(fwrite(stu,sizeof(student),1,fp)!
=1)
printf("filewriteerror\n");
stu=stu->next;
}
fclose(fp);
}
/*读取数据*/
student*load(student*stu)
{
FILE*fp;student*p,*r;r=stu;
if((fp=fopen("score1","r"))==NULL)/*为输入打开文件score1*/
returnstu;
do
{p=(student*)malloc(sizeof(student));
p->next=NULL;
if((fread(p,sizeof(student),1,fp)!
=1)){fclose(fp);returnstu;};
r->next=p;
r=r->next;
}while
(1);
}
/*输出一个特定的学生的成绩*/
voidoutput1(student*t)
{intk;
printf("%s\t%s\t",t->num,t->name);
for(k=0;k<5;k++)
printf("%d\t",t->score[k]);
printf("\n");
}
/*输出全体学生的成绩*/
voidoutput(student*stu)
{
stu=stu->next;
printf("学号\t姓名\t数学\t语文\t英语\t总分\t平均分\n");
while(stu!
=NULL)
{
output1(stu);
stu=stu->next;
}
}
/*将stu后插在t中*/
student*charu(student*stu,student*t)
{student*p;intk;
p=(student*)malloc(sizeof(student));
strcpy(p->num,stu->num);
strcpy(p->name,stu->name);
for(k=0;k<5;k++)
p->score[k]=stu->score[k];
p->next=t->next;
t->next=p;
returnp;
}
/*按成绩排序*/
voidpaixu(student*stu,inti)
{
student*t,*p,*r;
intj,k;p=stu;
printf("输入0按数学成绩\n");
printf("输入1按语文成绩\n");
printf("输入2按英语成绩\n");
printf("输入3按总分\n");
printf("输入4按平均分\n");
do
{
scanf("%d",&j);
if(j<0&&j>4)printf("输入错误请重新输入\n");
elsebreak;
}while
(1);
t=init(t);
r=t;
stu=stu->next;
if(t->next==NULL)
r=charu(stu,t);/*在排序好的链表t中插入第一个节点*/
if(i==0)/*按升序排序*/
while(stu->next!
=NULL)
{
stu=stu->next;
if(r->score[j]>stu->score[j])r=t;/*如果待插入的score[j]<当前的score[j],指针r回溯*/
while(r->next->score[j]
=NULL)
r=r->next;/*找到比待插入的score[j]大的指针r->next*/
r=charu(stu,r);/*在r后面插入stu*/
}
else
while(stu->next!
=NULL)
{
stu=stu->next;
if(r->score[j]
while(r->next->score[j]>stu->score[j]&&r->next!
=NULL)
r=r->next;
r=charu(stu,r);
}
output(t);
}
/*排序菜单*/
voidoutput2(student*stu)
{inti;
output(stu);
printf("输入0升序\n");
printf("输入1降序\n");
printf("输入其他任意字符退出\n");
scanf("%d",&i);
if(i==0||i==1)
paixu(stu,i);
printf("输入任意字符结束\n");
getch();
}
/*查找学生号为num是否存在*/
student*findnum(char*num,student*t,int*i)
{
*i=1;
if(t->next==NULL)
returnt;
else
{
*i=strcmp(t->next->num,num);
while(*i<0)/*t->next->num { t=t->next; if(t->next==NULL) returnt; *i=strcmp(t->next->num,num); } } returnt;/*t->next->num>=num时返回,此时i>=0*/ } /*插入一个学生信息*/ student*insertstu(char*num,student*stu,char*name) {student*p,*t;int*i,j;i=&j; t=findnum(num,stu,i);/*查找该学号是否存在*/ if(j! =0)/*该学号不存在,则插入*/ { p=init(p); strcpy(p->num,num); strcpy(p->name,name); p->next=t->next; t->next=p; returnstu; } else {printf("已有此学号\n学号\t姓名\n%s\t%s\n",t->next->num,t->next->name);returnstu;} } /*录入新学生信息*/ voidbase(student*stu) { charnum[10],name[20]; printf("输入e结束输入新学生的信息\n"); printf("num(不超过10个数)\tname(不超过10个字)\n"); scanf("%s",num); do { printf("\t\t\t"); scanf("%s",name); stu=insertstu(num,stu,name);/*插入一个学生信息*/ scanf("%s",num); }while(num[0]! ='e'); output(stu); printf("输入任意字符退出\n"); getch(); } /*增加修改一门课程成绩*/ voidzengjia(student*t,inti) { t->score[3]-=t->score[i];/*总分减去第i门课的成绩*/ scanf("%d",&(t->score[i]));/*输入第i门课的成绩*/ t->score[3]+=t->score[i];/*总分加上第i门课的成绩*/ } voiddeletegrade(student*t,inti) { t->score[3]-=t->score[i];/*总分减去第i门课的成绩*/ t->score[i]=0;/*第i门课的成绩归零*/ } /*修改成绩*/ voidaltergrade(student*stu) { intj,*i;student*t;chara,*num; i=&j; printf("0修改数学成绩\n"); printf("1修改语文成绩\n"); printf("2修改英语成绩\n"); printf("3删除数学成绩\n"); printf("4修改语文成绩\n"); printf("5修改英语成绩\n"); printf("输入e结束操作\n"); a=getch(); printf("学号\t成绩\n"); scanf("%s",num); while(num[0]! ='e') { t=findnum(num,stu,i);/*按学生号查找学生信息*/ if(j==0)/*学生号存在*/ { t=t->next; switch(a) { case'0': zengjia(t,0); break; case'1': zengjia(t,1); break; case'2': zengjia(t,2); break; case'3': deletegrade(t,0); break; case'4': deletegrade(t,1); break; case'5': deletegrade(t,2); break; default: break; } t->score[4]=t->score[3]/3; } else printf("无此学号\n"); scanf("%s",num); } output(stu); printf("输入任意字符结束\n"); getch(); } /*第i科成绩录入*/ studentgradeenter(student*stu,inti) { student*t;t=stu; t=t->next; printf("学号\t该科成绩\n"); while(t! =NULL) { printf("%s\t",t->num); if(t->score[i]==0)/*如果学号为t->num的同学该科成绩没有*/ { scanf("%d",&t->score[i]); t->score[3]+=t->score[i];/*学号为t->num的总分*/ t->score[4]=t->score[3]/3;/*学号为t->num的平均分*/ } else printf("%d\n",t->score[i]); t=t->next;/*录入下一个同学的该科成绩*/ } printf("该科全部输入完成\n输入任意字符结束\n"); getch(); } /*成绩录入菜单*/ voidentergrade(student*stu) { inti; printf("0录入数学成绩\n"); printf("1录入语文成绩\n"); printf("2录入英语成绩\n"); scanf("%d",&i); switch(i) { case0: gradeenter(stu,i);break; case1: gradeenter(stu,i);break; case2: gradeenter(stu,i);break; default: printf("输入错误请输入相应操作的题号\n"); } } /*按学生号查找学生*/ voidchaxun(student*stu) { char*num;intj,k,*i;student*t;i=&j; printf("输入要查询的学生学号\n"); scanf("%s",num); t=findnum(num,stu,i);/*查找学生号为num是否存在*/ if(j==0)/*该学生号存在*/ { t=t->next; printf("查询结果为\n"); printf("学号\t姓名\t数学\t语文\t英语\t总分\t平均分\n"); output1(t);/*输出此学生信息*/ } else printf("查无此号\n"); printf("输入任意字符结束\n"); getch(); } /*统计全班人数和平均分*/ voidtongji(student*stu) { inttotal=0,score=0; stu=stu->next; while(stu! =NULL) { score+=stu->score[3]; stu=stu->next; total++; } score=score/total; printf("班级总人数为: %d平均分为: %d\n输入任意字符退出\n",total,score); getch(); } /*按分数段查询*/ voidfenshuduan(student*stu) { inti,min,max,j; printf("输入0按数学分数段\n"); printf("输入1按语文分数段\n"); printf("输入2按英语分数段\n"); printf("输入3按总分分数段\n"); printf("输入4按平均分分数段\n"); scanf("%d",&i); printf("输入分数段上限: "); scanf("%d",max); printf("\n输入分数段下限: "); scanf("%d",min); if(max {j=max;max=min;min=j;} stu=stu->next; printf("学号\t姓名\t数学\t语文\t英语\t总分\t平均分\n"); while(stu! =NULL) { if(min<=stu->score[i]&&stu->score[i]<=max)/*将分数段内的同学信息输出*/ output1(stu); stu=stu->next; } } voidmain() { chara='8'; student*stu; stu=init(stu);/*初始化stu*/ stu=load(stu);/*读取score1的数据*/ while(a! ='7') { clrscr(); printf("************************************************************\n"); printf("学生成绩管理系统\n"); printf("-------madeinchina\n"); printf("\t0录入学生基本信息\n"); printf("\t1修改或删除学生成绩\n"); printf("\t2录入学生成绩\n"); printf("\t3显示指定学生的信息\n"); printf("\t4输出指定分数段的学生信息\n"); printf("\t5输出班级总人数和平均分\n"); printf("\t6输出全体学生的信息\n"); printf("\t7退出\n"); printf("*************************************************************\n"); a=getch(); switch(a) { case'0': base(stu);break; case'1': altergrade(stu);break; case'2': entergrade(stu);break; case'3': chaxun(stu);break; case'4': fenshuduan(stu);break; case'5': tongji(stu);break; case'6': output2(stu);break; case'7': break; default: printf("iamsorrytohearthatyouenterthewrongnum\n"); printf("按任意键重新输入\n");getch();continue; } } save(stu);/*将数据保存在score1中*/ printf("欢迎再次使用学生成绩管理系统........请按任意键退出......."); getch(); } #include structproject { floatChinaese; floatData; floatEnglish; }; structstudent { intnum; charname[30]; structprojectscore; floattotal; intsequence;//sequence: 中文名次 }stu[5]; voidinput(structstudentstu[5])//输入学生信息 { inti; printf("学号姓名语文数据结构英语\n"); for(i=0;i<5;i++) { scanf("%d",&stu[i].num); scanf("%s",&stu[i].name); scanf("%f",&stu[i].score.Chinaese); scanf("%f",&stu[i].score.Data); scanf("%f",&stu[i].score.English); } } voidcount(structstudentstu[5]) { inti; printf("学号姓名总分\n"); for(i=0;i<5;i++) { stu[i].total=stu[i].score.Chinaese+stu[i].score.Data+stu[i].score.English; printf("%d%s%f\n",stu[i].num,stu[i].name,stu[i].total); } } voidsort(structstudentstu[5])//直接插入排序降序排列 { structstudenttemp; inti,j; intk=1; intp; for(i=2;i<=5;i++) { temp=stu[i]; j=i-1; while(temp.total { stu[j+1]=stu[j]; j--; } stu[j+1]=temp; } printf("名次学号姓名语文数据结构英语总分\n"); for(p=5;p>0;p--) { if(p! =5) if(stu[p].total==stu[p+1].total) k--; stu[p].sequence=k; printf("%d%d%s%f%f%f%f\n",stu[p].sequence,stu[p].num,stu[p].name,stu[p].score.Chinaese,stu[p].score.Data,stu[p].score.English,stu[p].total); k++; } } voidprint(structstudentstu[5]) { inti; for(i=0;i<5;i++) { printf("学号姓名语文数据结构英语\n"); printf("%d%s%f%f%f\n",stu[i].num,stu[i].name,stu[i].score.Chinaese,stu[i].score.Data,stu[i].score.English); } } voidmain() { structstudentstu[5]; intt; printf("-------------------统计成绩-----------------\n"); do { printf("-----------选择操作--------------\n"); printf(" (1)学生信息输入 (2)总分统计(3)总分排序\n"); printf("我的选择是,t="); scanf("%d",&t); switch(t) { case1: printf("请输入学生信息\n"); input(stu); print(stu); break; case2: printf("每个学生的总分: \n"); count(stu); break; case3: printf("学生成绩由高到低排序\n"); sort(stu); break; default: printf("输入有误,请重试\n"); } }while(t! =0); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 问题