Joseph环求解算法的设计与实现@TOC
1.实验内容
约瑟夫(Joseph)问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。
【基本要求】
利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。
【测试数据】
m的初值为20;n=7,7个人的密码依次为:3,1,7,2,4,8,4,首先m值为6(正确的出列顺序应为6,1,4,7,2,3,5)。
【实现提示】
程序运行后,首先要求用户指定初始报数上限值,然后读取各人的密码。可设n≤30。此题所用的循环链表中不需要“头结点”,请注意空表和非空表的界限.
2.实验目的
掌握链表的基本操作:插入、删除、查找等运算,能够灵活应用链表这种数据结构。
3.程序清单
#include<iostream>
#include<stdio>
#include<stdlib>
using namespace;
typedef struct LNode{
int num,key;
struct LNode *next;
}LNode,*Linklist;
int joseph(int m,int n)
{
int i,a,e,j=1;
Linklist l,p,q,r;
l=(Linklist)malloc(sizeof(struct LNode));//建立新的链表
l->next=NULL;
for(i=n;i>0;--i){
p=(Linklist)malloc(sizeof(struct LNode));
p->next=l->next;
l->next=p;
}
while(p->next) p=p->next;
p->next=l->next;
r=l->next; //对链表内的数据进行初始化。
for(i=1;i<=n;i++) {
cout<<"请输入第"<<i<<"个数据的密码:";
cin>>a;
r->key=a;
r->num=i;
r=r->next;
}
for(i=1;i<=n-1;i++){r=r->next;}
p=l->next;
while(p!=r&&n>0)//循环至m
{
for(i=1;i<m;i++)
{r=r->next;
p=p->next;}
n--;
cout<<"本次去掉的序号为:";
cout<<p->num<<"\n";
cout<<"新的m值:"<<p->key<<"\n";
p=p->next;
{Linklist y;y=r->next;free(y);}
r->next=p;
}
free(p);
free(l);
return 0;
}//释放链表
void main()
{
int m,n;
cout<<"请输入首次的m值:\n";
cin>>m;
cout<<"请输入要参加的人数:\n";
cin>>n;
joseph(m,n);
cout<<”计算机171班 陈鑫倩同学”;
}
4.调试步骤
5.运行结果:
6.分析与思考
这次实验很早就开始做的,但还是遇到了很多困难。
也说不上是很多困难,困难不多但是很难解决。
首先就是这个链表的开辟。
一直在开辟的位置找错。
真正的错误出现在了约瑟夫环的执行过程。
下次一定要。
1.像老师所说的那样,一部分一部分的寻找错误。
2.链表程序段中的错误很可能出现在呢别的程序中,就比如今天这个的指针,没有在正确的位置。
3.指针所指的位置一定要及时释放。
4.在开辟空间的过程中不能定义双重指针,有没有要好好想清楚。
5.多次传递地址不能直接用指针进行传递,最好让函数返回一段空间的首地址。
感觉数据结构最关键的就是想好数据的存储方式,想好节点与节点,一段空间与一段空间之间如何联系。
emmmmm希望下次实验好好冷静好好思考,不要形成惯性思维,多多转换。
欢迎使用Markdown编辑器
新的改变
我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:
- 全新的界面设计 ,将会带来全新的写作体验;
- 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
- 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
- 全新的 KaTeX数学公式 语法;
- 增加了支持甘特图的mermaid语法1 功能;
- 增加了 多屏幕编辑 Markdown文章功能;
- 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
- 增加了 检查列表 功能。
功能快捷键
撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
查找:Ctrl/Command + F
替换:Ctrl/Command + G
合理的创建标题,有助于目录的生成
直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC
语法后生成一个完美的目录。
如何改变文本的样式
强调文本 强调文本
加粗文本 加粗文本
标记文本
删除文本
引用文本
H2O is是液体。
210 运算结果是 1024.
插入链接与图片
链接: link.
图片:
带尺寸的图片:
居中的图片:
居中并且带尺寸的图片:
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。
如何插入一段漂亮的代码片
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
// An highlighted block
var foo = 'bar';
生成一个适合你的列表
- 项目
- 项目
- 项目
- 项目
- 项目1
- 项目2
- 项目3
- 计划任务
- 完成任务
创建一个表格
一个简单的表格是这么创建的:
项目 | Value |
---|---|
电脑 | $1600 |
手机 | $12 |
导管 | $1 |
设定内容居中、居左、居右
使用:---------:
居中
使用:----------
居左
使用----------:
居右
第一列 | 第二列 |
---|