Joseph环求解算法的设计与实现

本文详细介绍了Joseph环求解算法的设计与实现,采用单向循环链表存储结构,模拟约瑟夫问题的过程,按出列顺序打印编号。实验目标在于掌握链表操作,包括插入、删除和查找。在实现过程中遇到的挑战主要集中在链表开辟和约瑟夫环的执行,强调了解决问题的策略和指针管理的重要性。
摘要由CSDN通过智能技术生成

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编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

功能快捷键

撤销: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.

图片: Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目 Value
电脑 $1600
手机 $12
导管 $1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列 第二列
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值