实验8复合数据类型实验

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1实验8复合数据类型【实验目的】①熟练掌握结构类型定义及对结构类型变量进行操作的各种方法②综合运用函数、数组、指针、结构类型及链表知识,掌握设计动态链表数据结构的方法以及对动态链表进行建立、插入、删除、检索的方法。【实验8.1】选票统计程序。设有3个候选人和10个选举人,选举人只要在自己的选票上书写自己选中的候选人的名字,程序据此能输出每个人得票结果。【指导】(1)设计一个结构类型数组leader,结构类型包含两个成员name(姓名)和count(得票数)。(2)通过循环将选中的候选人名字依次与数组leader中的三个元素的name成员比对(用if(strcmp(name,leader[j].name)==0)实现),若相等,则该候选人的得票数加1。循环结束后,即可输出每个候选人的得票数。【参考程序】#includestdio.h#includestring.hstructperson{charname[20];intcount;};structpersonleader[3]={li,0,zhang,0,wang,0};//候选人信息voidmain(){inti,j;charname[20];for(i=1;i=10;i++){scanf(%s,name);//选中的候选人姓名for(j=0;j3;j++)if(strcmp(name,leader[j].name)==0)leader[j].count++;//选中的候选人的拍偶数加1}printf(\n);for(i=0;i3;i++)printf(%5s:%d\n,leader[i].name,leader[i].count);//输出计票结果}【实验8.2】设计一个含有两个成员(职工号和产量)的结构类型,编写一程序能对5名职工在规定时间内完成的产品数量进行累计。每输入一个职工号,该职工的常量加1要最后输出每名职工的编号及完成的产量。【提示】此题与实验8.1相似,可以设计一个含5个元素的数组来存放每位职工的信息。统计时,可以用一个无限循环,每完成一件产品,即输入对应职工的职工号,该职工的产量将加1。当输入职工号为0时代表统计结束,最后输出将每名职工的编号和已完成的产量。【实验8.3】编写程序,用结构数组存放10名学生的考试成绩,包括姓名、英语、数学和两2门课程的平均成绩。要求程序能够自动计算出每名学生的平均成绩,并输出平均成绩最高的学生姓名及其平均成绩。【指导】(1)结构数组中每个元素含4个成员,即姓名、两门课程的成绩分及这两门课程的平均成绩。其中,表示成绩的三个成员可以用一个float型数组描述。(2)程序的功能应包括输入每个学生的信息,然后计算每位学生平均成绩,进而找出平均成绩最高的学生,并输出其信息。【参考程序】#includestdio.h#defineN10structstu{charname[20];floatscore[3];};intmax(structstu*p);voidmain(){inti,j,num;structstustudent[N];for(i=0;iN;i++)//输入学生信息{student[i].score[2]=0;//score[2]存放平均分printf(\n输入第%d个学生信息:\n,i+1);scanf(%s,student[i].name);//输入姓名for(j=0;j2;j++)scanf(%f,&student[i].score[j]);//输入两门课的成绩student[i].score[2]=(student[i].score[2]+student[i].score[j])/2;//计算平均分}num=max(student);//查找平均成绩最高的学生printf(第一名:姓名\t成绩\n\t);printf(%s\t,student[num].name);printf(%.1f\n,student[num].score[2]);}intmax(structstu*p)//查找平均成绩最高的数组元素的位置{inti,j;for(i=0,j=1;jN;j++)if(p[i].score[2]p[j].score[2])i=j;returni;}【实验8.4】在实验8.2的基础上编写sort()子函数,其功能是用冒泡排序方法对5名职工的产量按从大到小排序,并在主函数中调用sort()子函数,按照名次输出每位职工的编号及其产量。【提示】该题目主要是对结构类型数组进行简单算法应用的一个训练,可参考教材中对数组进行冒泡排序的方法,需注意的是排序的关键字并非数组元素本身而是数组元素的成员。另外,如果实验8.2中定义的结构数组为局部数组,则在设计本函数时注意参数传递的形式,以及3是否需要有返回值。讨论什么情况下不需要有返回值。【实验8.5】建立一个用于记录职工年龄信息的链表,每位职工均包含姓名和年龄两个基本信息。要求链表中各结点要按照职工年龄由小到大的顺序链接,并且链表建立后能依次输出链表各结点中的数据。【指导】(1)首先依题目要求定义链表中结点的类型。其次,链表中插入新结点,至少需要两个指针:①指向新建结点的指针q;②指向当前结点(插入位置)的前一个结点的指针p。二者配合完成。另外,由于头指针h用于标识整个链表的首地址。(2)依题目要求建立一个链表,但建链表的方法实际上有多种,如:不断将新结点插入到链表末尾或者是表头,这两种插入方案插入位置相对固定。而本题要求各结点按职工年龄的顺序链接,就是说每一个新结点的插入位置是待定的,需要程序来确定其插入位置。因此,设计程序流程如下:①建立空表②循环建立新结点、查找新结点插入位置、插入新结点,直至无新元素插入,退出循环输出链表。【参考程序】#includestdio.h#includestring.h#includestdlib.hstructstu{charname[20];//姓名intage;//年龄structstu*next;};voidmain(){structstu*h,*p,*q;//建空表h=(structstu*)malloc(sizeof(structstu));//为头结点分配空间并用头指针指向该空间if(h==NULL)//如果h中记录的地址为空,则前一步内存分配失败{printf(assignmemoryspaceerror!);exit(0);}h-name[20]=NULL;//'\0'的ASCII码为0h-age=NULL;h-next=NULL;//链表中插入元素while(1){if((q=(structstu*)malloc(sizeof(structstu)))==NULL){printf(分配内存失败!);exit(0);}//待插入结点各成员赋值printf(请输入姓名:\t);scanf(%s,q-name);if(strcmp(q-name,NULL)==0)break;printf(请输入年龄:\t);4scanf(%d,&q-age);q-next=NULL;//寻找插入位置for(p=h;p-next!=NULL&&p-next-ageq-age;p=p-next);//将结点插入链表q-next=p-next;p-next=q;}//链表输出for(p=h-next;p!=NULL;p=p-next)//若当前结点非空printf(\n姓名:%s\t年龄:%d\n,p-name,p-age);}【实验8.6】在实验8.5的基础上,编写一个del()子函数,其功能是按照用户输入的年龄在链表中检索,找到第一个年龄与输入年龄相同的结点,将它删除并输出被删除结点中的信息。如果未找到符合条件的结点,则输出查无此年龄职工。【提示】此题目与上一题目的共同点在于,都需要确定插入结点或删除结点的位置。而寻找指定结点、删除指定结点的方法在教材中均有详细介绍,此处不再赘述。强调删除结点时应注意释放被删除结点所占用的空间。

1 / 4
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功