Joseph ring实习报告.doc_第1页
Joseph ring实习报告.doc_第2页
Joseph ring实习报告.doc_第3页
Joseph ring实习报告.doc_第4页
Joseph ring实习报告.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

约瑟夫环问题模拟一、 需求分析1、 本演示程序模拟约瑟夫环问题:编号为1,2,n得n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。2、 演示程序以用户和计算机对话的方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中需要的相关信息及命令。运算结果显示在其后。3、 程序需要输入的信息与命令包括:1) 初始人数 n ;2) n 个人的密码;3) 初始的 m 值;4、 测试数据1) n:7密码:3、1、7、2、4、8、4 m:62) n:1密码:4 m:33) n:4密码:4、2、3、1 m:124) n:3密码:1、2、3 m:2二、 概要设计为了实现上述程序功能,应以单向循环链表模拟问题过程。每个结点代表一个玩家。1、 有序表抽象数据类型定义:ADT list数据对象:D = a i | a i LNode, i = 1,2,n, n = 0数据关系:R = | a i-1, a i D, i = 2,n基本操作:Init(&L)操作结果:构造一个空的单向循环链表。Insert(&L, n, s)初始条件:链表L已存在,玩家编号n,玩家密码s。操作结果:插入一个玩家结点。Del(&L, m, e)初始条件:链表L已存在,m值有效。操作结果:删除链表中第m个结点,并有e返回这个结点。ADT list2、 本程序包含两个模块:a) 主程序模块:int main()初始化;接受命令;处理命令;退出;return 0;b) 循环单向链表单元模块 实现单向循环链表抽象数据类型;模块之间的调用关系如下:主程序模块 单向循环链表单元模块三、 详细设计int main() /主函数main的实现 int n, m, s, i; List l; if (Init(l) /初始化链表,执行成功后接受命令 printf(how many players? : ); scanf(%d, &n); for (i = 1; i = 1; i-) /处理命令,模拟人员的退出结点的删除 if (Del(l, m, e) printf(the number %d player come outn, Num); m = (m - 1 + Sec) % (i - 1); if (m = 0) m = i - 1; /for /if else printf(ERROR!); return 0;typedef struct Lnode /链表结点类型定义 int intNum; int intSec; struct Lnode *next;Lnode, *Linklist;typedef struct /循环单向链表类型定义 Linklist head; Linklist tail;List;bool Init(List &l) /链表初始化 l.head = l.tail = NULL; return true;bool Insert(List &l, int N, int S) /在链表末尾插入玩家号为N,玩家密码为S的结点 Linklist p = (Linklist)malloc(sizeof(Lnode); if (!p) return false; p -intNum = N; p -intSec = S; if (!l.head) l.head = p; else l.tail -next = p; p -next = l.head; l.tail = p; return true;bool Del(List &l, int m, Lnode &e) /删除链表中第m个结点,并用e返回 Linklist p = l.tail; if (!p | m 1) return false; int cnt = 1; while (cnt next; cnt+; if (l.head = l.tail) p -next = NULL; e = *p; free(p); return true; Linklist q = p -next; if (q = l.tail) l.tail = p; if (m = 1) l.head = q -next; p -next = q -next; q -next = NULL; e = *q; free(q); return true;四、 调试分析1、 由于程序时模拟约瑟夫环过程的,只是单纯的对问题的抽象解决,在数据范围不是很大的情况下程序可以比较迅速的完成问题的模拟,但是在大数据范围下,本程序模拟的方法是不适用的,需要更优化的算法。2、 算法的时空分析1) 由于只用到了循环单链表,所以空间的负责度是根据输入要求玩家个数决定的,即空间复杂度是O(n),n为玩家个数,也是结点个数。2) 算法是模拟约瑟夫环玩家出列的过程,即不断的循环计数然后出列,故和初始的m值以及玩家手里的密码intSec值有关系。所以它的循环次数是m+intSec(i)。3、 本实习作业采用数据抽象程序设计方法,将程序划分为两个层次结构:主控制模块、链表模块,使得设计思路清晰,实现时调试顺利,各模块具有好的重用性,确实得到了一次良好的程序设计训练。五、 用户手册1、 本程序的运行环境为wind

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论