数据结构课程设计报告约瑟夫环完整版1Word文档格式.docx
- 文档编号:14824899
- 上传时间:2022-10-25
- 格式:DOCX
- 页数:23
- 大小:373.39KB
数据结构课程设计报告约瑟夫环完整版1Word文档格式.docx
《数据结构课程设计报告约瑟夫环完整版1Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告约瑟夫环完整版1Word文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
单循环链表;
c语言;
约瑟夫环;
序言
数据结构是研究数据元素之间的逻辑关系的一门课程,以及数据元素及其关系在计算机中的存储表示和对这些数据所施加的运算。
该课程设计的目的是通过课程设计的综合训练,培养分析和编程等实际动手能力,系统掌握数据结构这门课程的主要内容。
本次课程设计的内容是用单循环链表模拟约瑟夫环问题,循环链表是一种首尾相接链表,其特点是无须增加存储容量,仅对表的链接方式稍作改变,使表处理更加灵活,约瑟夫环问题就是用单循环链表处理的一个实际应用。
通过这个设计实例,了解单链表和单循环链表的相同与不同之处,进一步加深对链表结构类型及链表操作的理解。
通过该课程设计,能运用所学知识,能上机解决一些实际问题,了解并初步掌握设计、实现较大程序的完整过程,包括系统分析、编码设计、系统集成、以及调试分析,熟练掌握数据结构的选择、设计、实现以及操作方法,为进一步的应用开发打好基础。
正文
一、问题描述
约瑟夫环问题描述的是:
设编号为1,2,…,n的n(n>
0)个人按顺时针方向围坐一圈,每个人持有一正整数密码。
开始时选择一个正整数作为报数上限m,从第一个人开始顺时针方向自1起顺序报数,报到m时停止报数,报m的人出圈,将他的密码作为新的m值,从他在顺时针方向上的下一个人起重新从1报数。
如此下去,直到所有人都出圈为止。
令n最大值为100。
要求设计一个程序模拟此过程,求出出圈的编号序列。
如下图分析:
3
2
7
1
4
8
约瑟夫环原理演示图
5
6
第二部:
第一次停下的位置,此时6号出列,并将他的值作为新的m值,即:
新的m=8;
从7好开始继续向下走8次,到1号的位置
最后排序后的密码序列:
(本图只演示前两步)
第三步:
第二次,1号出列
第四步:
第三次,4号出列
第一步:
给第一个人赋初始密码为:
20则从它开始向下走20次,到6号位置
图2约瑟夫环原理演示图
二、逻辑设计
1、循环链表抽象数据类型定义
typedefstructLNode//定义单循环链表中节点的结构
{
intnum;
//编号
intpwd;
//password
structLNode*next;
//指向下一结点的指针
}LNode;
2、本程序包含一下几个模块
(1)构造结点模块
LNode*createNode(intm_num,intm_pwd)
LNode*p;
p=(LNode*)malloc(sizeof(LNode));
//生成一个结点
p->
num=m_num;
//把实参赋给相应的数据域
pwd=m_pwd;
next=NULL;
//指针域为空
returnp;
}
(2)创建链表模块
voidcreateList(LNode*ppHead,intn)
(3)出队处理模块
voidjose(LNode*ppHead,intm_pwd)
(4)约瑟夫环说明输出模块
voidinstruction()
(5)菜单模块
voidmenu()
(6)主函数模块
intmain()
函数的调用关系图如下:
三、详细设计
1.主函数
Main()开始
Menu()功能菜单
功能1:
约瑟夫环说明
功能2:
按要求求解约瑟夫环
功能3:
退出系统
输入总人数n
输入开始上线数:
m
输入每个玩家的密码
调用:
createList(&
ppHead,n);
jose(ppHead,m);
函数求解所需的密码序列
选择要执行的操作
程序运行完,自动返回到功能菜单
图4主函数数据流程图
根据流程图,主函数程序如下:
intn,m,x;
LNode*ppHead=NULL;
menu();
for(;
;
){
printf("
\n请选择要执行的操作:
"
);
scanf("
%d"
&
x);
system("
cls"
switch(x){
case1:
printf("
****************************************************************\n"
printf("
约瑟夫环:
\n"
编号为1,2,3,4…,n的n个人按顺时针方向围坐一圈,每人持有一个密\n"
码(正整数).一开始任选一个正整数作为报数的上限值m,从第一个人开始\n"
按顺时针方向自1开始顺序报数,报到m时停止.报m的人出列,将他的密码\n"
m作为新的m值,从他在顺时针方向上的下一人开始重新从1报数,如此下去,\n"
直到所有人全部出列为止.编程打印出列顺序.\n"
main();
break;
case2:
printf("
\n请输入总人数n:
scanf("
n);
请输入开始上限数m:
scanf("
m);
createList(&
出队顺序:
jose(ppHead,m);
\n约瑟夫环游戏结束!
case0:
exit(0);
default:
system("
\n您选择的操作有误,请重新选择...\n\n\n"
main();
}
}
return0;
2.链表的创建
/*创建单向循环链表ppHead,人数个数为n,并输入每个人的密码值,若建立失败则生成头结点,让cur指向他,若建立成功则插入结点P,cur指向的数据元素为p,后续为"
空"
的节点,再把P插入循环链表ppHead中*/
根据流程图,创建链表函数程序如下:
voidcreateList(LNode**ppHead,intn)
inti,m_pwd;
LNode*p,*cur;
//cur:
浮标指针
for(i=1;
i<
=n;
i++)
{
输入第%d个人的密码:
i);
m_pwd);
//输入持有密码
p=createNode(i,m_pwd);
//调用构造结点函数
if(*ppHead==NULL)//如果头结点为空
{
*ppHead=cur=p;
//生成头结点,让cur指向他
cur->
next=*ppHead;
//cur的指针域指向自身
else//如果不为空,则插入结点
p->
next=cur->
next;
next=p;
cur=p;
//cur指向新插入结点
}
}
完成创建!
//提示链表创建完成
}
3.出队处理
/*p指向要删除节点的前一个节点,ppHead指向要删除的节点,使p=ppHead,ppHead再指向要删除节点的下一个节点,使p和ppHead链接,输出p指向节点的编号和密码值,释放ppHead,如此循环,直至把所有节点都打印和删除为止!
*/
根据流程图,出队函数程序如下:
inti,j;
LNode*p,*p_del;
//定义指针变量
p!
=ppHead;
i++){
for(j=1;
j<
m_pwd;
++j){
p=ppHead;
//p赋值为ppHead,p指向要删除结点的前一个结点
ppHead=ppHead->
//ppHead指向下一个元素
p->
next=ppHead->
//p结点与头结点链接
i=ppHead->
pwd;
//i赋值为ppHead->
pwd
j=ppHead->
num;
//j赋值为ppHead->
num,j为要删除的密码值
第%d个人出列,密码:
%d\n"
j,i);
m_pwd=ppHead->
//m_pwd赋值为ppHead->
free(ppHead);
//释放头结点
ppHead=p->
//ppHead重新赋值给p->
next,即释放前的ppHead->
pwd指针//删除报数结点
i=ppHead->
j=ppHead->
num
最后一个出列是%d号,密码是:
free(ppHead);
4.约瑟夫环说明模块
按顺时针方向自1开始顺序报数,报到时停止.报m的人出列,将他的密码\n"
******************************************************\n"
5.菜单模块
voidmenu(){
**************************约瑟夫环******
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告 约瑟夫 完整版