数据结构-约瑟夫环实验报告.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
HUNAN UNIVERSITY 课程实习报告 题 目 约瑟夫环问题 一、需求分析 要求设编号为1-n的n(n0)个人按顺时针方向围成一圈.首先第1个人从1开始顺时针报数.报m的人(m 为正整数).令其出列。然后再从他的下一个人开始,重新从1顺时针报数,报m的人,再令其出列。如此下去,直到圈中所有人出列为止。求出列编号序列。 输入的形式和输入值的范围:输入形式是定义为int的整形变量,范围是1~n。 输出的形式:定义为int的整形变量 程序所能达到的功能:要求能按照题目要求输出正确结果。 测试数据: 输入:10,3 输出:3 6 9 2 7 1 8 5 10 4 当输入是非整形变量时提示输入错误,并要求输入正确值。 概要设计 (1)抽象数据类型的定义: 为实现上述程序的功能,可以用整数存储用户的输入。并将用户输入的值存储于线性表中。线性表ADT定义如下: 数据对象:整形 数据关系:线性关系,即ai,ai+1(0≤a<n)。 基本操作: bool remove(int elem)//移除一个元素,被移除的元素赋给elem 如果操作成功,返//回true,否则返回false bool isEmpty()//判断数组的元素是否清空,空返回true,否则返回false bool setPos(int place)//设置当前元素的位置,设置成功返回true,否则返回false int getLength()//获取数组的实际长度 (2)算法的基本思想: 约瑟夫环问题中的数据是人所站的位次,这种数据是,所有元素都有前驱和后继,符合线性表的特点。模拟约瑟夫环的出列问题,因为没有入列等操作,所以采用顺序表来实现线性表比较合适。 核心算法主要分为两步: 1、确定需要输出并删除的位置,2、输出并删除该位置。 已知报数间隔m,我们可以把当前位置加上m获得需要删除的位置,如果获得的位置超过顺序表中实际元素的总长度,则可以通过减去数组的实际长度来修正。然后把顺序表中的当前指向位置设置为该位置,继而删掉该位置。反复进行上述确定位置和删除位置的操作,直到顺序表为空。 如果报数间隔m总人数n,则通过m除以n取余的方法计算实际出列时的间隔。 (3)主程序的流程: 程序由三个模块组成: (1)输入模块:提示输入总人数n和报数间隔m,中间用逗号隔开。 (2)处理模块:将元素储存于顺序表中。在主函数中根据报数间隔确定需要删除的元素的位置,在顺序表中设置该位置并删除该位置,同时输出该位置的值。反复设置并删除直到顺序表为空。 (3)输出模块:分别在DOS界面,按移除元素的顺序依次输出显示。 (4)各程序模块之间的层次(调用)关系: 主函数会按设计的方法调用顺序表中“获取实际长度”、“设置需要输出和删除的元素的位置”、“移除并输出该位置元素”和“判断是否为空表”四个模块,使元素依次出列,并正确结束程序。 详细设计 (1)实现概要设计中定义的所有数据类型(构建ADT并实现基本操作): 用整形存储用户输入的整数。 2、用顺序表实现线性表: class AList { private: int *listArray;//指向数组的指针 int realSize; //数组中含有元素的实际长度 int fence; //指向当前元素下标 public: //构造函数,初始化数组 AList(int s) { listArray=new int[s]; for(int i=0;is;i++) listArray[i]=i+1;//数组值等于数组下标+1 realSize=s; fence=0;//指向首元素 } //移除一个元素,并将要输出元素给elem bool remove(int elem) { if(isEmpty()) return false;//如果数组为空返回false elem = listArray[fence]; for(int i=fence;irealSize-1;i++)//从当前位置开始循环向前赋值 {

文档评论(0)

xx88606 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档