数据结构课程设计之约瑟夫问题.docx
- 文档编号:26427551
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:15
- 大小:33.60KB
数据结构课程设计之约瑟夫问题.docx
《数据结构课程设计之约瑟夫问题.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计之约瑟夫问题.docx(15页珍藏版)》请在冰豆网上搜索。
数据结构课程设计之约瑟夫问题
设计题目<一>:
3.3“银行排队系统”的设计与实现P445
一、设计要求5
1.问题描述5
2.需求分析5
二、概要设计6
3.系统功能设计7
三、模块设计7
1.模块设计7
2.系统子程序及功能设计7
3.函数主要调用关系图8
1.数据类型定义8
2.系统主要子程序详细设计9
五、测试分析11
六、用户手册13
七、调试报告13
八、程序清单14
设计题目<二>:
6.4.1二叉排序树基本操作的实现盘P13430
一、设计要求30
1.问题描述30
2.需求分析30
二、概要设计30
1.主界面设计30
2.存储结构设计31
3.系统功能设计31
三、模块设计31
1.模块设计31
2.系统子程序及功能设计32
3.函数主要调用关系图32
四、详细设计32
1.数据类型定义32
2.系统主要子程序详细设计33
五、测试分析37
六、用户手册38
七、调试报告38
八、程序清单38
设计题目<三>:
2.4.2约瑟夫问题P3445
一、设计要求45
1.问题描述45
2.需求分析45
二、概要设计45
1.主界面设计45
2.存储结构设计45
3.系统功能设计46
三、模块设计46
1.模块设计46
2.系统子程序及功能设计46
3.函数主要调用关系图46
四、详细设计46
1.数据类型定义46
2.系统主要子程序详细设计47
(1)主函数模块设计47
五、测试分析50
六、用户手册51
七、调试报告51
八、程序清单51
设计题目<三>:
2.4.2约瑟夫问题P34
一、设计要求
1.问题描述
约瑟夫问题时:
编号为1,2,,,,n的n个人按顺时针方向围坐一圈,每人持有一个密码。
一开始人性一个正整数作为报数上限值m,从第一个人开始顺时针方向自1开始顺序报数,报到m时停止报数。
报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。
2.需求分析
输入形式:
两个整数n和m;输出形式:
在一行中输出n个整数;程序功能:
能够输出n个人的出列编号;例如:
输入207;输出6,1,4,7,2,3,5
二、概要设计
1.主界面设计
约瑟夫问题界面设计并复杂,根据提示输入数,运行结果如下:
图3-1主界面
2.存储结构设计
本系统采用循环链表的存储结构,
structNode//循环节点的定义
{
intnumber;//编号
Node*next;//尾指针
};
3.系统功能设计
本系统分为两部分;1用户指定上限值;2读取每人的密码。
三、模块设计
1.模块设计
循环链表操作模块
读取模块
主程序模板
图3-2模块调用示意图
2.系统子程序及功能设计
本系统中5个函数,包括主函数。
各函数功能如下:
(1)Node*CreateList(Node*L,int&n,int&m);//建立约瑟夫环函数
(2)voidJoseph(Node*L,intn,intm);//输出每次出列号数函数
(3)Node*DeleteList(Node**L,inti,Node*q);//寻找每次出列人的号数
(4)intLengthList(Node*L);//计算环上所有人数函数
3.函数主要调用关系图
5Main()
4
3
2
1
图3-3系统函数调用关系图
四、详细设计
1.数据类型定义
(1)循环节点的定义
structNode//循环节点的定义
{
intnumber;//编号
Node*next;//尾结点
};
(2)全局变量定义
intn,m;
2.系统主要子程序详细设计
(1)主函数模块设计
voidmain()//主函数
{
Node*L;
L=NULL;//初始化尾指针
intn,m;
cout<<"请输入人数N:
";
cin>>n;//环的长度
if(n<1){cout<<"请输入正整数!
";}//人数异常处理
else
{
cout<<"请输入所报数M:
";
cin>>m;
if(m<1){cout<<"请输入正整数!
";}//号数异常处理
else
{
L=CreateList(L,n,m);//重新给尾指针赋值
Joseph(L,n,m);
}
}
system("pause");
}
(2)建立一个约瑟夫环(尾插法)
Node*CreateList(Node*L,int&n,int&m)//建立一个约瑟夫环(尾插法)
{
Node*q;
for(inti=1;i<=n;i++)
{
Node*p;
p=newNode;
p->number=i;
p->next=NULL;
if(i==1)L=q=p;//工作指针的初始化
else
{
q->next=p;
q=q->next;
}
}
q->next=L;
if(L!
=NULL){return(L);}//返回尾指针
elsecout<<"尾指针异常!
"< } (3)输出每次出列的人 voidJoseph(Node*L,intn,intm)//输出每次出列的人 { intk; cout<<"请输入第一个报数人: "; cin>>k; if(k<1||k>n){cout<<"请输入1-"< else { cout<<"\n出列顺序: \n"; for(inti=1;i { Node*q=newNode; if(i==1)q=DeleteList(&L,k+m-1,q);//第一个出列人的号数 elseq=DeleteList(&L,m,q); cout<<"号数: "< deleteq;//释放出列人的存储空间 } cout<<"最后一个出列号数是: "< } } (4)寻找每次出列的人 Node*DeleteList(Node**L,inti,Node*q)//寻找每次出列的人 { if(i==1)i+=LengthList(*L);//顺序依次出列情况的处理方式 Node*p; p=*L; intj=0; while(j q=p->next; p->next=p->next->next; *L=p->next; return(q); } (5)计算环上的人数 intLengthList(Node*L)//计算环上的人数 { if(L){cout<<"尾指针错误! "< else { inti=1; Node*p=L->next; while(p! =L) { i++; p=p->next; } return(i); } } 5、测试分析 1,在主菜单下按照提示输入数字,如下,输入的数字如下所示 图3-4输入界面 2,按下enter键可得到以下结果 图3-4输出界面 六、用户手册 用户只需在主界面上输入初始值为20,m=7,7个人的密码输入3,1,7,2,4,8,4. 七、调试报告 在调试过程中遇到了很多问题,在这些问题中有逻辑错误也有语法错误,我是先通过调试检查代码找出其中的语法错误然后通过设置断点找到逻辑错误。 实在找不到就请教大神帮忙! 嘿嘿! ! ! 用到的循环链表有关的知识,虽然中间有很多的失败,但通过思考和讨论,最终测试成功。 八、程序清单 #include usingnamespacestd; structNode//循环节点的定义 { intnumber;//编号 Node*next; }; Node*CreateList(Node*L,int&n,int&m);//建立约瑟夫环函数 voidJoseph(Node*L,intn,intm);//输出每次出列号数函数 Node*DeleteList(Node**L,inti,Node*q);//寻找每次出列人的号数 intLengthList(Node*L);//计算环上所有人数函数 voidmain()//主函数 { Node*L; L=NULL;//初始化尾指针 intn,m; cout<<"请输入人数N: "; cin>>n;//环的长度 if(n<1){cout<<"请输入正整数! ";}//人数异常处理 else { cout<<"请输入所报数M: "; cin>>m; if(m<1){cout<<"请输入正整数! ";}//号数异常处理 else { L=CreateList(L,n,m);//重新给尾指针赋值 Joseph(L,n,m); } } system("pause"); } Node*CreateList(Node*L,int&n,int&m)//建立一个约瑟夫环(尾插法) { Node*q; for(inti=1;i<=n;i++) { Node*p; p=newNode; p->number=i; p->next=NULL; if(i==1)L=q=p;//工作指针的初始化 else { q->next=p; q=q->next; } } q->next=L; if(L! =NULL){return(L);}//返回尾指针 elsecout<<"尾指针异常! "< } voidJoseph(Node*L,intn,intm)//输出每次出列的人 { intk; cout<<"请输入第一个报数人: "; cin>>k; if(k<1||k>n){cout<<"请输入1-"< else { cout<<"\n出列顺序: \n"; for(inti=1;i { Node*q=newNode; if(i==1)q=DeleteList(&L,k+m-1,q);//第一个出列人的号数 elseq=DeleteList(&L,m,q); cout<<"号数: "< deleteq;//释放出列人的存储空间 } cout<<"最后一个出列号数是: "< } } Node*DeleteList(Node**L,inti,Node*q)//寻找每次出列的人 { if(i==1)i+=LengthList(*L);//顺序依次出列情况的处理方式 Node*p; p=*L; intj=0; while(j q=p->next; p->next=p->next->next; *L=p->next; return(q); } intLengthList(Node*L)//计算环上的人数 { if(L){cout<<"尾指针错误! "< else { inti=1; Node*p=L->next; while(p! =L) { i++; p=p->next; } return(i); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 约瑟夫 问题