数据结构实验题参考答案

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

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

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

资源描述

【实验题】1.狐狸逮兔子围绕着山顶有10个圆形排列的洞,狐狸要吃兔子,兔子说:“可以,但必须找到我,我就藏身于这十个洞中,你先到1号洞找,第二次隔1个洞(即3号洞)找,第三次隔2个洞(即6号洞)找,以后如此类推,次数不限。”但狐狸从早到晚进进出出了1000次,仍没有找到兔子。问兔子究竟藏在哪个洞里?(提示:这实际上是一个反复查找线性表的过程。)【数据描述】定义一个顺序表,用具有10个元素顺序表来表示这10个洞。每个元素分别表示围着山顶的一个洞,下标为洞的编号。#defineLIST_INIT_SIZE10//线性表存储空间的初始分配量typedefstruct{ElemType*elem;//存储空间基址intlength;//当前长度intlistsize;//当前分配的存储容量(以sizeof(ElemType)为单位)}SqList;【算法描述】statusInitList_Sq(SqList&L){//构造一个线性表LL.elem=(ElemType)malloc(LIST_INIT_SIZE*sizeof(ElemType));If(!L.elem)returnOVERFLOW;//存储分配失败L.length=0;//空表长度为0L.listsize=LIST_INIT_SIZE;//初始存储容量returnOK;}//InitList_SqstatusRabbit(SqList&L){//构造狐狸逮兔子函数intcurrent=0;//定义一个当前洞口号的记数器,初始位置为第一个洞口for(i=0;iLIST_INIT_SIZE;i++)L.elem[i]=1;//给每个洞作标记为1,表示狐狸未进之洞L.elem[LIST_INIT_SIZE-1]=L.elem[0]=0;//首先进入第一个洞,标记进过的洞为0。for(i=2;i=1000;i++){current=(current+i)%LIST_INIT_SIZE;//实现顺序表的循环引用L.elem[i]=0;//标记进过的洞为0}//第二次隔1个洞找,第三次隔2个洞找,以后如此类推,经过一千次printf(兔子可能藏在如下的洞中:)for(i=0;iLIST_INIT_SIZE;i++)if(L.elem[i]==1)printf(“第%d个洞\n”,i+1);//输出未进过的洞号returnOK;}//end【C源程序】#includestdio.h#includestdlib.h#defineOK1#defineOVERFLOW-2typedefintstatus;typedefintElemType;#defineLIST_INIT_SIZE10/*线性表存储空间的初始分配量*/typedefstruct{ElemType*elem;/*存储空间基址*/intlength;/*当前长度*/intlistsize;/*当前分配的存储容量(以sizeof(ElemType)为单位)*/}SqList;statusInitList_Sq(SqList*L){/*构造一个线性表L*/(*L).elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));if(!((*L).elem))returnOVERFLOW;/*存储分配失败*/(*L).length=0;/*空表长度为0*/(*L).listsize=LIST_INIT_SIZE;/*初始存储容量*/returnOK;}/*InitList_Sq*/statusRabbit(SqList*L){/*构造狐狸逮兔子函数*/inti,current=0;/*定义一个当前洞口号的记数器,初始位置为第一个洞口*/for(i=0;iLIST_INIT_SIZE;i++)(*L).elem[i]=1;/*给每个洞作标记为1,表示狐狸未进之洞*/(*L).elem[LIST_INIT_SIZE-1]=0;(*L).elem[0]=0;/*第一次进入第一个洞,标记进过的洞为0*/for(i=2;i=1000;i++){current=(current+i)%LIST_INIT_SIZE;/*实现顺序表的循环引用*/(*L).elem[current]=0;/*标记进过的洞为0*/}/*第二次隔1个洞找,第三次隔2个洞找,以后如此类推,经过一千次*/printf(\n兔子可能藏在如下的洞中:);for(i=0;iLIST_INIT_SIZE;i++)if((*L).elem[i]==1)printf(\n此洞是第%d号洞,i+1);/*输出未进过的洞号*/returnOK;}voidmain(){SqList*L;InitList_Sq(L);Rabbit(L);getch();}【测试数据】最后的输出结果为:2479【说明】本算法思路比较简单,采用了顺序表表示围着山顶的10个洞,首先对所有洞设置标志为1,然后通过1000次循环,对每次所进之洞修改标志为0,最后输出标志为1的洞。2.银行客户某银行有一个客户办理业务站,在单位时间内随机地有客户到达,设每位客户的业务办理时间是某个范围内的随机值。设只有一个窗口,一位业务人员,要求程序模拟统计在设定时间内,业务人员的总空闲时间和客户的平均等待时间。假定模拟数据已按客户到达的先后顺序依次存于某个正文数据文件中。对应每位客户有两个数据,到达时间和需要办理业务的时间。复习概念:与栈相对应,队列是一种先进先出的线性表。它只允许在表的一端进行插入,而在另一端进行删除元素。允许插入的一端称队尾,允许删除的一端称队头。插入与删除分别称为入队与出队。队列示意图见图3-2:出队←a1a2……an-1←an进队队头队尾【数据描述】typedefstruct{intarrive;inttreat;//客户的信息结构}QNODE;typedefstructnode{QNODEdata;Structnode*next;//队列中的元素信息}LNODELNODE*front,*rear;//队头指针和队尾指针【算法描述】{设置统计初值;设置当前时钟时间为0;打开数据文件,准备读;读入第一位客户信息于暂存变量中;do{//约定每轮循环,处理完一位客户if(等待队列为空,并且还有客户){//等待队列为空时累计业务员总等待时间;时钟推进到暂存变量中的客户的到达时间;暂存变量中的客户信息进队;读取下一位客户信息于暂存变量;}累计客户人数;从等待队列出队一位客户;将该客户的等待时间累计到客户的总等待时间;设定当前客户的业务办理结束时间;while(下一位客户的到达时间在当前客户处理结束之前){暂存变量中的客户信息进队;读取下一位客户信息于暂存变量;}时钟推进到当前客户办理结束时间;}while(还有未处理的客户);计算统计结果,并输出;【C源程序】#includestdio.h#includestdlib.h#defineOVERFLOW-2typedefstruct{intarrive;inttreat;/*客户的信息结构*/}QNODE;typedefstructnode{QNODEdata;structnode*next;/*队列中的元素信息*/}LNODE;LNODE*front,*rear;/*队头指针和队尾指针*/QNODEcurr,temp;charFname[120];FILE*fp;voidEnQueue(LNODE**hpt,LNODE**tpt,QNODEe){/*队列进队*/LNODE*p=(LNODE*)malloc(sizeof(LNODE));if(!p)exit(OVERFLOW);/*存储分配失败*/p-data=e;p-next=NULL;if(*hpt==NULL)*tpt=*hpt=p;else*tpt=(*tpt)-next=p;}intDeQueue(LNODE**hpt,LNODE**tpt,QNODE*cp){/*链接队列出队*/LNODE*p=*hpt;if(*hpt==NULL)return1;/*队空*/*cp=(*hpt)-data;*hpt=(*hpt)-next;if(*hpt==NULL)*tpt=NULL;free(p);return0;}voidmain(){intdwait=0,clock=0,wait=0,count=0,have=0,finish;printf(\nenterfilename:);scanf(%s,Fname);/*输入装客户模拟数据的文件的文件名*/if((fp=fopen(Fname,r))==NULL){/*打开数据文件*/printf(cannotopenfile%s,Fname);return;}front=NULL;rear=NULL;have=fscanf(fp,%d%s,&temp.arrive,&temp.treat);do{/*约定每轮循环,处理一位客户*/if(front==NULL&&have==2){/*等待队列为空,但还有客户*/dwait+=temp.arrive-clock;/*累计业务员总等待时间*/clock=temp.arrive;/*时钟推进到暂存变量中的客户的到达时间*/EnQueue(&front,&rear,temp);/*暂存变量中的客户信息进队*/have=fscanf(fp,%d%d,&temp.arrive,&temp.treat);}count++;/*累计客户人数*/DeQueue(&front,&rear,&curr);/*出队一位客户信息*/wait+=clock-curr.arrive;/*累计到客户的总等待时间*/finish=clock+curr.treat;/*设定业务办理结束时间;*/while(have==2&&temp.arrive=finish){/*下一位客户的到达时间在当前客户处理结束之前*/EnQueue(&front,&rear,temp);/*暂存变量中的客户信息进队*/have=fscanf(fp,%d%d,&temp.arrive,&temp.treat);}clock=finish;/*时钟推进到当前客户办理结束时间*/}while(have==2||front!=NULL);printf(结果:业务员等待时间%d\n客户平均等待时间%f\n,dwait,(double)wait/count);printf(模拟总时间:%d,\n客户人数:%d,\n总等待时间:%d\n,clock,count,wait);getch();}/*main_end*/’【测试数据】设数据装在一个数据文件data.dat中,内容为:106138显示结果为:enterfilename:data.datenterfilename:data.dat结果:业务员等待时间10客户平均等待时间25.500000模拟总时间:72,客户人数:2,总等待时间:51【说明】在计算程序中,程序按模拟环境中的事件出同顺序逐一处理事件:当一个事件结束时,下一个事件隔一段时间才发生,则程序逻辑的模拟时钟立即推进到下一事件的发生时间;如一个事件还未处理结束之前,另有其他事件等待处理,则这些事件就应依次排队等候处理。3.二叉树的的应用:设计一个表示家谱的二叉树要求:采用一棵二叉树表示一逐步形成家谱关系,对于给定的父亲显示所有的儿子。由于家谱为树形,但不是一棵二叉树,所以在存储时要转换成二叉树的形式。规定:一个父亲结点的左子树表示母亲结点,母亲结点的右子树表示他们的所有儿子,例如,图1是一个用二叉树表示的家谱图,与之对应的传统树形图家谱图如图2所示。这样就将家谱树转换成二叉树了,而二叉树的操作是容易实现的。图2一个家谱树图1二叉树表示的家谱图[C源程序]#includestdio.h#includestring.h张德、陈氏张文、刘氏张武、王氏张兵、李氏张强张华张兵张德张

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

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

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

×
保存成功