数据结构课程设计敢死队问题终极版.docx
- 文档编号:30565545
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:24
- 大小:91.43KB
数据结构课程设计敢死队问题终极版.docx
《数据结构课程设计敢死队问题终极版.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计敢死队问题终极版.docx(24页珍藏版)》请在冰豆网上搜索。
数据结构课程设计敢死队问题终极版
数据结构课程设计:
敢死队问题(终极版)
*******************
实践教学
*******************
计算机与通信学院
2011年春季学期
算法与数据结构课程设计
题目:
敢死队问题
专业班级:
软件一班
姓名:
唐振乙
学号:
********
*********
成绩:
_______________
摘要................................................................................................................2
前言................................................................................................................3
正文................................................................................................................4
一、需求分析......................................................................................................4
1.数据需求分析....................................................................................................4
2.功能需求分析....................................................................................................4
二、程序总体设计.............................................................................................5
1.模块划分..............................................................................................................5
2.总体流程图..........................................................................................................5
3.函数调用关系图..................................................................................................6
4.部分伪代码..........................................................................................................7
三、调试分析...................................................................................................11
A.调试中遇到的问题及解决方法...................................................................11
B.运行演示.......................................................................................................12
总结.................................................................................................................13
参考文献.................................................................................................................14
致谢.................................................................................................................15
附录:
源代码(带注释)...................................................................................16
1
摘要
敢死队问题是根据著名的“约瑟夫环”演变而来的敢死队问题的处理与计算来设计的一个系统。
整个系统从符合操作简便、界面友好、灵活、实用、安全的要求出发,完成敢死队问题的全过程,包括创建四个数据结构(顺序存储结构、单链表存储结构、循环队列存储结构、数组存储结构)、数据的处理与计算、数据的分析、结果的输出。
关键字:
敢死队问题顺序表单向循环链表循环队列数组
2
前言
有M个敢死队员要炸掉敌人的一碉堡,谁都不想去,排长决定用轮回数数的办法来决定哪个战士去执行任务。
如果前一个战士没完成任务,则要再派一个战士上去。
现给每个战士编一个号,大家围坐成一圈,随便从某一个战士开始计数,当数到5时,对应的战士就去执行任务,且此战士不再参加下一轮计数。
如果此战士没完成任务,再从下一个战士开始数数,被数到第5时,此战士接着去执行任务。
以此类推,直到任务完成为止。
排长是不愿意去的,假设排长为1号,请你设计一程序,求出从第几号战士开始计数才能让排长最后一个留下来而不去执行任务。
3
正文
一、需求分析
1、数据需求分析:
本系统的主要数据是正整数、结构体、指针
(1)正整数信息包括:
队伍的人数,报数的数值,报数开始的位置。
(2)结构体储存每个战士的信息。
(3)指针包括链表的头指针、尾指针、当前指针。
2、功能分析:
本系统要实现对敢死队问题的模拟解决~需要实现一下几个功能
(1)创建存储结构:
创建顺序表,创建单链表,创建数组。
(2)数据的输入:
把队伍的人数,报数的数值输入。
(3)数据的处理;对队伍的人数,报数的数值进行计算。
(4)结果的输出:
每执行一次任务的战士的编号、执行结果、报数开始的位置输出,包括显示器和文件输出。
4
二、程序总体设计
1、模块划分
(1)、操作界面模块提供操作界面的信息输出模式。
(2)、单循环链表存储结构模块用于通过运用顺序结构模块来计算结果。
(3)、循环队列存储结构模块用于通过运用单链表结构模块来计算结果。
(4)、顺序表模块用于通过运用数组结构模块来计算结果。
(5)、数组表模块用于通过运用数组结构模块来计算结果。
2、总体流程图、函数调用关系图
(1)总体流程图
5
(2)函数调用关系图
3、部分伪代码
(1)主函数
voidmain()
{
display1();
intchoice;//菜单选择
intnum;//战士数目
while(cin>>choice)
6
{
if(choice<1||choice>4)
{
cout<<"请选择正确的菜单:
";
continue;
}
if(choice==1||choice==3||choice==4)
cout<<"请输入不超过"< 字): "; else cout<<"请输入战士数目(数字): "; ///////输入战士数目 while(! (cin>>num)) { cin.clear(); while(cin.get()! ='\n') continue; cout<<"请正确输入: "; } clearline(); while(num<2) { 7 if(num<1)////////对输入的树木小于1,作出反应 {cout<<"战士数目不能少于一人! \n请重新输入: "; cin>>num; continue; } elseif(num==1)////////对输入战士数目为1的情况,作出反 应 { cout<<"只有一个战士,别无选择! \n请重新输入: "; cin>>num; continue; }; } switch(choice)///////////当输入大于1人时,根据选择的数据类 型,进行处理 { case1: Nlist(num);break; case2: One_way(num);break; case3: Cirqueue(num);break; case4: Array(num);break; } display2();/////再次输出选择菜单 8 } } (2)循环队列方法 voidCirqueue(intnum,intCCC) { inti,start,count,j; CirQueues; for(start=1;start<=num;start++)//start为测试起点 { Initial(&s);//初始化队列 for(i=1;i<=num;i++)//将所有士兵的编号依次进队 { EnQueue(&s,i); }; for(i=1;i { j=DeQueue(&s);//删除队头结点 EnQueue(&s,j);//这两句是把队头的元素取出来然后放到 队尾去,经过这个循环以后,要从那个开始的士兵的编号就会在队的 9 队头位置了 }; count=0;//删除结点数 while(count { for(i=1;i { j=DeQueue(&s); EnQueue(&s,j);//这两句是把队头的元素取出来然后放到对尾 };//经过这个循环以后,队头的那个节点的值就是数到5对应的节点 j=DeQueue(&s);//把这个节点出队,但是没有在把它放到队尾,就相当于把它删除了 count++; };//同第一个方法是一样,删除点数为m-1是结束循环 if(s.data[s.front]==1)break;//此时队只剩一个点,如果是排长就输出 } cout<<"应从第: "< } 10 三、调试分析 A、调试中遇到的问题及解决方法 说明: (1)本程序运行的环境是VisualC++2010; (2)程序运行后,显示的提示信息为选择使用数据类型的菜单,正确输入后,会依次出现提示输入战士数目,报数数字。 均正确输入后,即可输出相应的计算结果。 (3)调试 调试过程中,出现如下错误信息: 发现错误为: “usingnamespacestd”指令只声明在main()内部。 改正为: 将“usingnamespacestd”指令声明为全局范围,即可正确运行。 11 B: 程序运行演示: 12 总结 通过这次课程设计我又学到了很多东西,如程序的模块化设计思想等,同时也加深了对数据结构这门课程的理解和学会了如何在实际中应用数据结构编程。 经过分析,了解到此次课程设计敢死队问题的核心其实就是经典的约瑟夫环问题,只是在其输出上稍有不同而已。 这个方法是用单循环链表来做的,实现的方法是这样的: 首先从第一号开始报数,循环到指定的偏移位置删除结点,直至剩下一个结点。 然后设计输出,令这个位置为队长位置,队首为开始报数的位置,并按此输出即为所求。 这种方法大大的降低了时间复杂度,复杂度为O(mn)。 13 参考文献 1严蔚敏,吴伟民.《数据结构(C语言版)》.清华大学出版社. 2严蔚敏,吴伟民.《数据结构题集(C语言版)》.清华大学出版 社. 3《DATASTRUCTUREWITHC++》.WilliamFord,WilliamTopp. 清华大学出版社(影印版). 4谭浩强.《c语言程序设计》.清华大学出版社. 5(数据结构与算法分析(Java版),APracticalIntroductiontoData StructuresandAlgorithmAnalysisJavaEditionCliffordA.Shaffer,张 铭,刘晓丹译电子工业出版社2001年1月 14 致谢 感谢指导老师,及同学们对我的帮助。 15 附录: 源代码(带注释) #include //单向循环链表结点定义 typedefstructlnode{ intnum;//战士编号 structlnode*next;//指向下个结点的指针}lnode; //顺序表定义 typedefstructNList{ intlength; intmark[100]; }NList; //循环队列定义 typedefstructCirQueue{ intdata[QueueSize]; intfront;//代表数组存放的第一个数据对应的下标,即对头 intrear;//代表数组存放的最后一个数据对应的下标,对尾 intcount;//计数器,记录队中元素总数}CirQueue; //函数声明 /////////////////////////////////////////////////开始菜单,版权声明voiddisplay1();////含有声明 voiddisplay2();////选择菜单 voidclearline();////清除多余的输入 /////////////////////////////////////////////////////循环队列函数声明voidInitial(CirQueue*Q);//初始化队列函数intIsEmpty(CirQueue*Q);//判断队是否为空intIsFull(CirQueue*Q);//判断队列是否为空voidEnQueue(CirQueue*Q,intx);//入队操作 16 intDeQueue(CirQueue*Q);//删除操作 voidCirqueue(intnum,intCCC);//队列方法处理数据 ///////////////////////////////////////////////////////////////////////// voidOne_way(intM,intCCC);///////////////////////////单向循环链表算法///////////////////////////////////////////////////////////////////////// voidArray(intpeople,intCCC);///////////////////////////////////数组算法///////////////////////////////////////////////////////////////////////// voidNlist(intnum,intCCC);//////////////////////////////////////顺序表算法//////////////////////////////////////////////////////////////////////// voidmain() { display1(); intchoice;//菜单选择 intnum;//战士数目 intCCCC;///报数数字 while(cin>>choice)////////////////对输入非菜单选项的数字作出反应 { if(choice<1||choice>4) { cout<<"请选择正确的菜单: "; continue; } ////////////////////////////输入战士数目 if(choice==1||choice==3||choice==4)/////当选择的数据结构中含有数组时,提示最大值 cout<<"请输入不超过"< "; else cout<<"请输入战士数目(数字): "; while(! (cin>>num))////////对输入进行检测并作出反应 { cin.clear(); while(cin.get()! ='\n') continue; cout<<"请正确输入: "; } clearline();//////////对输入如“123abc”的情况作出处理,清除结尾的字符 while(num<2) { if(num<1)////////对输入的树木小于1,作出反应 {cout<<"战士数目不能少于一人! \n请重新输入: "; cin>>num; 17 continue; } elseif(num==1)////////对输入战士数目为1的情况,作出反应 { cout<<"只有一个战士,别无选择! \n请重新输入: "; cin>>num; continue; }; } cout<<"请输入报数数字: "; cin>>CCCC; switch(choice)///////////当输入大于1人时,根据选择的数据类型,进行处理 { case1: Nlist(num,CCCC);break; case2: One_way(num,CCCC);break; case3: Cirqueue(num,CCCC);break; case4: Array(num,CCCC);break; } display2();////////////输出菜单,进行下一次测试 } } ///////////////////////////////////////////////开始菜单和版权声明函数定义 voiddisplay1() { cout<<"**************************************"< <<"*《敢死队》唐振乙*"< <<"*版权所有翻版必究*"< <<"**************************************"<<"\n\n\n\n\n"; cout<<"请选择数据类型: 1、顺序表2、单向循环链表3、循环队列4、数组Q、退出"< } voiddisplay2()///////////////选择菜单 { cout<<"\n\n请选择数据类型: 1、顺序表2、单向循环链表3、循环队列4、数组Q、退出"< } 18 voidclearline()////////清除当前行多余的部分 { while(cin.get()! ='\n') continue; } /////////////////////////////////////////////////////////////循环队列方法//初始化对令队为空 voidInitial(CirQueue*Q){ Q->front=Q->rear=0;//对头等于对尾代表队列为空 Q->count=0; } //判队列是否为空 intIsEmpty(CirQueue*Q){ if(Q->count==0)return1;//如果队里的元素个数为0,队列空,返回1 elsereturn0; } //判队列是否满 intIsFull(CirQueue*Q){ if(Q->count==QueueSize)return1; elsereturn0; } //将元素进队 voidEnQueue(CirQueue*Q,intx) { if(IsFull(Q)) { printf("列满\n"); exit (1); };///如果堆满就退出程序 Q->count++;//否则就进入,元素总数加一 Q->data[Q->rear]=x;//数组的最后一位赋值为x Q->rear=(Q->rear+1)%QueueSize;//改变数组最后一位的下标值,如果不是循环的 队列那么下标只要简单的加1就 行,但是循环的话要考虑下标已经为最大而再加1就要到下标为0(即又循环到最开始) 的情况,所以要用(Q->rear+1)%QueueSize} //元素出队列 intDeQueue(CirQueue*Q){ inttemp; 19 if(IsEmpty(Q)) { printf("队列为空\n");//下溢,退出运行 exit (1); } temp=Q->data[Q->front];//将队头的元素取出到temp里面 Q->count--;//队列元素个数减1 Q->front=(Q->front+1)%QueueSize;//循环意义下的头指针后移(即数组中第一个元 素存放的位置的下标加1) returntemp; } ///////////////////方法 voidCirqueue(intnum,intCCC){ inti,start,count,j; CirQueues; for(start=1;start<=num;start++)//start为测试起点 { Initial(&s);//初始化队列 for(i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 敢死队 问题 终极
![提示](https://static.bdocx.com/images/bang_tan.gif)