约瑟夫斯问题求解Word格式文档下载.docx
- 文档编号:15809156
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:11
- 大小:67.56KB
约瑟夫斯问题求解Word格式文档下载.docx
《约瑟夫斯问题求解Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《约瑟夫斯问题求解Word格式文档下载.docx(11页珍藏版)》请在冰豆网上搜索。
3.输出的形式:
输出的是按出列顺序印出各人编号,为正整数int型。
4.测试数据要求:
测试数据要求为int型
三、概要设计
1.所用到得数据结构及其ADT
为了实现上述功能,应以单向循环链表有序链表表示集合
数据类型。
1.单向循环链表抽象数据类型定义:
typedefstructnode
{
ElemTypedata;
ElemTypenum;
structnode*next;
}SLNODE;
基本操作:
structnode*create_sl(intn);
//创建单向循环链表
2.主程序流程及其模块调用关系
1)创建循环链表的流程图
开始
2)约瑟夫问题求解流程图
i
丄
p=head;
i=1
P-
3)主函数流程图
四、详细设计
1.实现每个操作的伪码,重点语句加注释
主程序:
voidmain(){
SLNODE*head;
intn,m;
head=(SLNODE*)malloc(sizeof(SLNODE));
***********************************
*/\n"
);
//
初始界面
printf(”
学号:
031350102\n"
姓名:
王亚文\n"
约瑟夫斯问题求解\n"
printf("
/*
printf(”输入总人数n=\n"
scanf("
%d"
&
n);
printf(”输入初始报数值m=\n"
m);
head=create_sl(n);
Josephus(head,n,m);
}
2.创建循环单链表structnode*create_sl(intn)
SLNODE*p,*s,*head;
ElemTypex;
inta;
p=head;
head->
next=head;
for(a=1;
a<
=n;
a++)//循环直到输入n个密码值跳出循环{
s=(SLNODE*)malloc(sizeof(SLNODE));
printf("
请输入第%d个人的密码值\n"
a);
scanf("
&
x);
s->
data=x;
num=a;
if(head->
next==head)head=s;
elsep->
next=s;
p=s;
}
p->
returnhead;
3.约瑟夫斯问题求解:
voidJosephus(SLNODE*head,intn,intm)
SLNODE*p,*q;
inti;
出列序列:
"
while(p->
next!
=p)
for(i=1;
i<
m;
i++)//报数报的m时跳出循环
q=p;
p=p->
next;
m=p->
data;
//读取新的密码值
%4d"
p->
num);
q_>
next=p->
//删除p节点
free(p);
p=q_>
next;
%4d\n"
4.函数调用关系图
主函数中调用了structnode*create_sl(intn);
voidJosephus(SLNODE*head,intn,intm);
两个函数
五、调试分析
1.设计与调试过程中遇到的问题分析、体会
1)创建单链表时,一开始写的程序是voidcreate_sl(SLNODE*head,intn),并没有没
有报错,但最后运行时却不是想象的结果,然后尝试在主函数中写一个printf函数看一下
创建表是否创建成功,事实证明并没有,后来改成了structnode*create_sl(intn);
解
决了这个问题,再次就是建表的时候发现最后一个数并不是我输入的数,然后就是开始改那
个循环=函数,发现我虽然是读了7个数,但第7个数并没有赋值给链表,原错误函数:
next=head;
请输入密码值\n"
n;
a++)//循环直到输入n个密码值跳出循环
{s=(SLNODE*)malloc(sizeof(SLNODE));
printf("
请输入密码值\n"
经过修正后的函数:
a++)//循环直到输入n个密码值跳出循环
2)建表成功之后开始解决本次的主问题约瑟夫斯求解问题,本问题主要考虑循环终止条件,
一开始写的是head->
发现经常运行错误,后来修正用p->
=p,然后最后一个p值单独写一句输出printf("
num);
中间的句子就是找到报数值然后删除,注意保留要删除节点的密码值,并没有什么大问题。
还有一个问题,就是在开始的时候创建单链表并没有想到要用序号值num最开始定义单链表的语句:
然后就会在创建链表赋值时和解决约瑟夫斯问题时都要重新定义一个变量x进行
计数,增加了程序的复杂度最后修正为:
structnode*next;
3)剩下的还有一些小问题,比如少打了一个字母,打错一个字母,这些程序会报错,不属于
逻辑错误,所以解决起来也比较快,
2.主要算法的时间复杂度分析
创建单链表的时间复杂度为O(n);
约瑟夫斯问题的时间复杂度与n值有关,也与每个人的密码值有关,时间复杂度O(mn;
空
间复杂度为O(n);
六、使用说明
程序运行后显示提示信息,提示用户输入人数n,初始报数值mn个人的密码,用户按照提
示输入完毕后,程序自动输出运算结果。
七、测试结果
八、附录
#include<
stdio.h>
malloc.h>
stdlib.h>
#include<
time.h>
typedefintElemType;
structnode*next;
//单链表的定义structnode*create_sl(intn);
voidJosephus(SLNODE*head,intn,intm);
intmain()//主函数
intn,m;
time_trawtime;
structtm*timeinfo;
time(&
rawtime);
timeinfo=localtime(&
voidJosephus(SLNODE*head,intn,intm)//约瑟夫斯问题求解
i++)//程序运行到第m个人跳出循环
q->
p=q->
九、实验收获和感想
通过本实验首先是解决了约瑟夫斯问题,利用计算机快速解决这个问题,其次在程序编写过程中慢慢掌握了循环单链表的一些用法以及注意事项,因为距离上次学习c语言已经有很长一段时间,这次确实遇到了很多障碍,不仅仅是对链表的生疏,也包含以前基础的薄弱环节,通过一个程序的设计,慢慢回忆起程序的编写,加强自己的逻辑性,编程是一个很麻烦的事,一个小错误的出项,程序就不会出现预想的结果,如果报错还可以
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 约瑟夫 问题 求解