约瑟夫(Josephu)环C++课程设计数据结构(12页).doc
《约瑟夫(Josephu)环C++课程设计数据结构(12页).doc》由会员分享,可在线阅读,更多相关《约瑟夫(Josephu)环C++课程设计数据结构(12页).doc(12页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、-约瑟夫(Josephu)环C+课程设计数据结构-第 10 页目录1 前言1背景和意义1设计的原理、方法和主要内容12 正文1设计的目的和意义1目标与总体方案2设计方法和内容2链表的实现2设计程序3设计创新和关键技术8设计创新8关键技术8结论83 致谢9参考文献9附录A 源程序的清单9前言数据是计算机化的信息,它是计算机可以直接处理的最基本和最重要的对象。无论是进行科学计算或数据处理、过程控制以及对文件的存储和检索及数据库技术应用等,都是对数据进行加工处理的过程。因此,要设计出一个结构好效率高的程序,必须研究数据的特性及数据间的相互关系及其对应的存储表示,并利用这些特性结合相关编程技术,运用合
2、适、熟练的方法,才能设计出符合要求、可操作性强、有利用价值的应用程序。1.2设计的原理、方法和主要内容本实验设计主要涉及到了队列的相关概念、原理、算法和操作等方面内容。本实验设计主要实现队列的3个基本功能:建立新的Josephu链表、插入一个元素、删除一个元素。应用到的原理是先进先出算法。主要内容是使用C语言和C+语言相结合编写程序,能够顺利通过键盘来操作该程序,完整实现上述要求。约瑟夫(Josephu)问题:已知N个人围坐在一张圆桌周围(不妨以1,2,N对每一个人依次编号),现在先从序号为K的人开始报数,数到m的那个人出列,他的下一个人又从1开始数,报数到m的人出列直到所有人都出列为止。从上
3、述分析可见,在C+中不能用动态分配的一维数组来实现循环队列。如果用户的应用程序中设有循环队列,则必须为它设定一个最大队列长度;若用户无法预估所用队列的最大长度,则宜采用链队列。在做插入或删除元素的操作时,会产生大量的数据元素移动;对于长度变化较大的线性表,要一次性地分配足够的存储空间,但这些空间常常又得不到充分的利用;线性表的容量难以扩充。在程序中有还参照了课外书籍上的一些函数及程序段完成了Josephu链表最主要功能之一的Josephu环功能。在main函数中加入了才学会的Switch,case语句使程序的输出看上去能比较有可视感。正文课程设计目的是为学生提供了一个既动手又动脑,独立实践的机
4、会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。提高学生适应实际,实践编程的能力。通过实践让学生理论和实际操作相结合,更好的理解书面知识,并在巩固的基础上融会所学认识。课程设计的意思是培养学生运用所学课程的知识分析解决实际问题的能力;培养学生调查研究、查阅技术文献、资料、手册以及编写技术文献的能力;通过课程设计,要求学生在指导教师的指导下,独立完成设计课题的全部内容,包括:(1)通过调查研究和上机实习,收集和调查有关技术资料。(2)掌握课程设计的基本步骤和方法。(3)根据课题的要求进行上机实验调试。本实验设计的目标是运用循环链表来解决Josephu环问题,其中运用
5、了许多链表中的基本操作使改程序能不只解决一个Josephu的简单链表,其中的Josephu函数则是用于,运用C+程序(或C语言)编写程序,实现队列的建立、插入和删除基本功能,在程序设计成功的基础上,进一步深化理解队列的作用和实现原理,并独自撰写设计论文。本实验设计总体方案如图2-1所示:图2-1设计总体方案图要求本设计严格按照方案进行,力求省时省力,提高设计效率,节约资源。2.3.1Josphu链表的实现Josphu链表链式表示和实现约瑟夫(Josephu)问题:已知N个人围坐在一张圆桌周围(不妨以1,2,N对每一个人依次编号),现在先从序号为K的人开始报数,数到m的那个人出列,他的下一个人又
6、从1开始数,报数到m的人出列直到所有人都出列为止。给出出列的顺序图2-2链队列示意图 循环链表队列的顺序表示和实现和顺序栈相似,在队列的顺序存储结构中,除了用一组地址连续的存储单元依次存放从队列头到队列尾的元素之外,尚需附设两个指针front和rear分别指示队列头元素及队列尾元素的位置。为了C语言中描述方便起见,在此我们约定,初始化建空队列时,令front=rear=0,每当插入新的队列尾元素时,“尾指针增1”;每当删除队列头元素时,“头指针增1”从上述分析可见,在C+中不能用动态分配的一维数组来实现循环队列。如果用户的应用程序中设有循环队列,则必须为它设定一个最大队列长度;若用户无法预估所
7、用队列的最大长度,则宜采用链队列。2.3.2设计程序编写本实验设计程序采用C语言和C+想结合的方法,在允许中文环境下运行。本设计程序如下:(1).构造Josephu链表: 由于是应用了类的结构,在main()函数又有选择语句,直接构造回产生错误所以我在构造最初的Josephu链表时运用了两个函数JosephuLink()函数和putin()函数。JosephuLink()函数能构造一个空链表而putin()函数则往其中放入初始值。template JosephuLink:JosephuLink() /利用头插法定义构造函数head=new Node;template void JosephuL
8、ink:putin()int i;cinn;if(n1)cout输入参数错误!data=1;tail=head;for(i=2;i=n;i+)p=new Node;p-data=i;tail-next=p;tail=p;cout构建的Josephu链表为:next=head;p=head; for(i=1;i=n;i+)coutdatanext;coutendl;如图2-3所示:图2-3 程序图(2).插入操作 插入操作较为简单只是对以前链表的该操作做了一些简单的修改就能运用于该程序,插入操作用的是Insert()函数。template bool JosephuLink:Insert() /插
9、入int loc;T x;coutloc; coutx; if(loc1) /判断位置是否合法cout输入参数错误,插入失败!endl;return false;Node*p=head-next;for(int i=1;inext;Node*m=new Node;m-data=x;if(loc-1!=0)m-next=p-next;p-next=m;elsem-next=head-next;head-next=m;cout新的数列为:;n+;return true;(3).删除操作同插入操作一样删除操作也是利用的以前对链表的操作加以简单改编而成,在本程序中删除操作为Delete函数。templ
10、ate bool JosephuLink:Delete() /删除int loc;T x;coutloc; if(loc1|head=NULL) /判断位置是否合法return false; Node*p=head;if(loc=1)head=head-next;elseNode*q=head; for(int i=0;inext;p=q-next;q-next=p-next;x=p-data;delete p;n-;return true;(4).Josephu操作Josephu操作为本程序的重点,在本程序中我是利用了一个Josephu函数来解决该问题的,该函数是通过不断的循环、淘汰、再循环
11、、再淘汰直到将Josephu链表中的所有元素被删除。函数如下:template int JosephuLink: Josephu()int m, k;int i;cout请输入执行中的每隔几位数淘汰一个元素:m;cout请输入从第几个数开始执行:k;p=head;for(i=1;inext;cout执行过程如下:nnext)for(i=1;inext;q-next=p-next;cout本轮删除元素为:datanext; n-; f=p;cout剩下的链表为 :;for(i=1;i=n;i+)coutdatanext;coutnext)cout最终剩余的元素为:data;delete p;he
12、ad=NULL;return 0;template void JosephuLink:putin()int i;cinn;if(n1)cout输入参数错误!data=1;tail=head;for(i=2;i=n;i+)p=new Node;p-data=i;tail-next=p;tail=p;cout构建的Josephu链表为:next=head;p=head; for(i=1;i=n;i+)coutdatanext;coutendl;(5).显示当前链表操作template void JosephuLink:show() /遍历操作Node *q;q=head;coutdata;q=he
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 约瑟夫 Josephu C+ 课程设计 数据结构 12
限制150内