C语言链表实现歌手评分系统
本文实例为大家分享了C语言链表实现歌手评分系统的具体代码,供大家参考,具体内容如下
此程序可以添加文件操作用于保存歌手得分等信息,此程序实现了链表的增删查和链表冒泡排序交换节点功能
#include#include #include //创建结构体及其成员 typedefstructNode { intnum;//编号 charname[20];//姓名 floatgrade[10];//评委评分 floatsum;//总分 floatave;//平均分 structNode*next;//指针域 }S;//结构体定义为S //各函数定义 voidmenu();//菜单函数 S*create();//创建链表函数 voidprint(S*);//输出链表函数 voidinsert(S*);//插入节点函数 voiddel(S*);//删除节点函数 voidsearch(S*);//查找节点函数 voidsort(S*);//节点排序函数 voidcal(S*);//计算选手数据函数 //主函数 intmain() { S*head; intn,a=1;//n用来控制选择操作类型,a控制循环,以-1终止 while(a>0) { menu();//显示菜单 printf("youwanttodo:"); scanf("%d",&n);//选择操作 switch(n)//各操作数字对应菜单数字,通过n确定操作类型 { case1://创建 head=create(); print(head); break; case2://计算 cal(head); print(head); break; case3://插入 insert(head); print(head); break; case4://删除 del(head); print(head); break; case5://查找 search(head); break; case6://排序 sort(head); print(head); break; case7://保存 save(head); break; case8: read();//读取 print(head); break; default: a=-1;//跳出循环条件 break; } } return0; } //菜单模块直接显示 voidmenu() { printf("\n\n"); printf("\t\t|----------SCORE-----------|\n"); printf("\t\t|\t1.create|\n"); printf("\t\t|\t2.cal|\n"); printf("\t\t|\t3.insert|\n"); printf("\t\t|\t4.del|\n"); printf("\t\t|\t5.search|\n"); printf("\t\t|\t6.sort|\n"); printf("\t\t|\t9.exitprogram|\n"); printf("\t\t|--------------------------|\n"); printf("\t\t\tchoice(1-9):\n"); } //创建链表模块 S*create() { S*head,*p,*q;//定义指针 inti; head=(S*)malloc(sizeof(S));//头节点开辟空间 head->ave=NULL;//置空头节点的ave成员 head->next=NULL;//置空头节点的指针域 q=head;//q指针记录头节点的地址 p=head->next;//p指针记录头节点的指针域的地址 printf("pleaseinputsinger'snumandname\n"); intnum; scanf("%d",&num); while(num!=0)//输入选手编号输入为零停止循环 { p=(S*)malloc(sizeof(S));//p指针开辟空间 //输入各成员 p->num=num; scanf("%s",p->name); printf("pleaseinputsinger'sscore:\n"); for(i=0;i<10;i++) { scanf("%f",&p->grade[i]); } p->sum=0; p->ave=0; p->next=NULL;//置空p节点的指针域 q->next=p;//p,q节点连接 q=p;//q指针后移 scanf("%d",&num); } returnhead;//返回链表的起始地址 } //计算模块 voidcal(S*head) { S*p;//定义p指针 inti; floatmax,min;//记录最高分最低分 p=head->next;//p记录头节点的指针域地址 while(p)//p不为空时进行计算 { p->sum=0;//每次计算初始化sum min=max=p->grade[0];//每次计算初始化min,max for(i=0;i<10;i++) { p->sum+=p->grade[i];//计算总分 if(p->grade[i]>max) max=p->grade[i];//记录最高分 if(p->grade[i] grade[i];//记录最低分 } p->ave=(p->sum-max-min)/8;//计算平均(去掉最高分最低分) p=p->next;//p指针后移 } } //插入节点模块(可多个插入) voidinsert(S*head) { inti,num,flag=1;//flag实现判断指针是否到达最后一个节点 floatmin,max;//min,max记录最高分最低分 S*p,*q,*r;//定义指针便于插入操作 printf("pleaseinputasinger'smessages:\n"); printf("pleaseinputsinger'snum:\n"); scanf("%d",&num); while(num!=0)//输入编号不为零时循环,以零终止,可实现多个插入 { r=(S*)malloc(sizeof(S));//为r开辟空间 r->next=NULL;//置空r的指针域 //输入相关数据,并计算相关数据 r->num=num; printf("pleaseinputsinger'sname:\n"); scanf("%s",r->name); printf("pleaseinputsinger'sscore:\n"); r->sum=0; for(i=0;i<10;i++) { scanf("%f",&r->grade[i]); r->sum+=r->grade[i]; } min=max=r->grade[0]; for(i=0;i<10;i++) { if(r->grade[i]>max) max=r->grade[i]; if(r->grade[i] grade[i]; } r->ave=(r->sum-max-min)/8; q=head;//q指针记录头节点的地址 p=head->next;//p指针记录头节点的指针域的地址 while(q->next!=NULL&&p->ave ave)//循环条件:当q->next不为空,以及p->ave ave实现插入后无需排序 { p=p->next;//p指针后移 q=q->next;//q指针后移 if(q->next==NULL)//这个判断防止q->next为空时,在执行循环是出现野指针使程序出错 { p=NULL;//防止出现野指针p q->next=r;//连接节点 r->next=NULL;//置空r指针域 flag=0;//到达最后一个节点更改flag break; } } if(flag)//判断是否到达最后一个节点,为真执行该操作 { r->next=p; q->next=r; //实现将r节点插入链表 } printf("pleaseinputsinger'snum:\n"); scanf("%d",&num); } } //删除节点模块 voiddel(S*head) { S*p,*q;//定义指针 intb;//用于输入编号查找删除 p=head;//p记录头节点的地址 q=head->next;//q记录头节点的指针域的地址 printf("inputsinger'snumyouwanttodelete:"); //输入编号 scanf("%d",&b); while(q!=NULL)//q不为空时执行循环 { if(q->num==b)//判断是否找到输入的编号 //为真时 { p->next=q->next;//断开q节点 free(q);//释放q节点neicun q=NULL;//置空q指针防止出现野指针 } else { //判断为假时 p=p->next;//p指针后移 q=q->next;//q指针后移 } } if(p==NULL)//当查找到最后一个节点还未查到要删除的编号时,输出ERRORINPUT printf("ERRORINPUT\n"); } //查找节点模块 voidsearch(S*head) { S*p;//定义指针 intb;//定义b用于输入查找编号 printf("inputthesinger'snumyouaresearching:"); //输入查找编号 scanf("%d",&b); p=head->next; while(p!=NULL) { if(p->num==b)//判断是否找到选手编号 { //为真时,输出信息 printf("%d%s%.2f%.2f\n",p->num,p->name,p->sum,p->ave); break; } else //为假时 p=p->next;//指针后移 } if(p==NULL)//查找到最后一个节点还未查到要的编号时,输出ERRORINPUT printf("ERRORINPUT\n"); } //排序节点模块 //采用冒泡排序,交换节点 voidsort(S*head) { S*p,*pre,*temp,*tail; tail=NULL; //算法的核心部分,节点交换 while(head->next!=tail){ pre=head; p=head->next; while(p->next!=tail){ if(p->ave>p->next->ave){ temp=p->next; pre->next=p->next; p->next=p->next->next; pre->next->next=p; p=temp; } //节点后移 p=p->next; pre=pre->next; } tail=p; } } //输出链表模块 voidprint(S*head) { inti; S*p=head->next; while(p)//当p不为空的时候执行 { printf("%d%s%.2f%.2f\n",p->num,p->name,p->sum,p->ave); for(i=0;i<10;i++) printf("%.2f",p->grade[i]); printf("\n"); p=p->next;//指针后移 } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。