已知一组编号分别是:4,7,5,9,3,2,6,1,8,按照约瑟夫环原理打印出队列。

举例说明约瑟夫原理:

(1)设定一个报数值,如:3,从1开始报数,报到3的时候将对应的数据删除。

(2)然后继续从删除数据的下一个数开始,从1开始报数,报数到3的时候将对应的数据删除。

(3)当删除最后一个数(即:8)的时候,下一个从数列开头开始报数。

(4)直到所有元素删除。

这里需要按照元素删除的顺序打印出来:5,2,8,9,1,3,7,6,4

如下图:


下面分别使用两种方法实现。

1. 使用循环链表实现约瑟夫环。

#include<stdio.h>
#include<stdlib.h>
//定义一个结点
typedef struct node
{int value;struct node *next;
}node;
//创建一个循环链表
node * create_cycle_link()
{int a[]={4,7,5,9,3,2,6,1,8};int len_a = sizeof(a)/sizeof(a[0]);int i = 0;node *head = (node*)malloc(sizeof(node));node *p,*nd;head->value = a[i++];head->next = NULL;p = head;while(i<len_a){nd = (node*)malloc(sizeof(node));nd->value = a[i++];nd->next = NULL;p->next = nd;p = nd;} p->next = head;return head;
}
//约瑟夫环的实现
void joseph_ring(node*head,int key)
{node *p = head,*tail;node *q = p;int i=1;while(p->next!=head){p = p->next;}tail = p;//tail是尾结点p = head;//p是后面要删除的结点q = tail;//q是p结点的上一个结点while(p->next!=p){if(i==key){//删除p结点printf("%d\t",p->value);q->next = p->next;p = q->next;i = 1;}else{q = p;p = p->next;i++;}}printf("%d\t",p->value);
}int main()
{node *l = create_cycle_link();node *head = l;int key = 3;do{printf("%d\t",l->value);l = l->next;}while(l!=head);printf("\n");joseph_ring(head,key);return 0;
}

运行后:

2. 用C++的STL实现:

使用C++的list容器实现,比使用循环链表更简单一些。

#include<iostream>
#include<list>
using namespace std;
void joseph_ring_stl(list<int> a,int key)
{int i = 1;auto it = a.begin();while(!a.empty()){if(i == key){cout<<*it<<"\t";a.erase(it++);if(it==a.end()){it = a.begin();}i = 1;}else{i++;it++;if(it==a.end()){it = a.begin();}}}
}int main() {list<int> a = {4,7,5,9,3,2,6,1,8};int key = 3;joseph_ring_stl(a,key);return 0;
}

运行后:

约瑟夫环的两种实现方法相关推荐

  1. Java学习之约瑟夫环的两中处理方法

    1 package day_2; 2 3 import java.util.Scanner; 4 5 /** 6 * @author Administrator 7 * 约瑟夫环问题: 设编号为 1, ...

  2. Java判断单链表是否有环的两种实现方法

    http://blog.jobbole.com/106227/ 方法一:首先从头节点开始,依次遍历单链表的每一个节点.每遍历到一个新节点,就从头节点重新遍历新节点之前的所有节点,用新节点ID和此节点之 ...

  3. 快速排序的两种实现方法(c语言版本)

    经过调研发现,对任意无序整数数组,快速排序有两种实现方法,这里简单阐述下思路: 思路一:随意选择一个基准元,一般选择数组的起始元或末尾元,Weiss这本书上特意搞了个算法来选择基准元,--,总之就是基 ...

  4. R语言生存分析COX回归分析实战:两种治疗方法发生肾功能损害的情况

    R语言生存分析COX回归分析实战:两种治疗方法发生肾功能损害的情况 目录

  5. mysql workbench kernelbase.dll_电脑出现kernelbase.dll错误的两种解决方法

    KernelBase.dll是Windows操作系统的重要文件,它为各种应用程序提供服务.如果电脑提示kernelbase.dll错误,这该怎么处理?大家可以用电脑自带的防火墙或者是第三方软件来进行故 ...

  6. 使用定制的NSDictionary的方法,对NSArray进行排序(附:数组排序两种常见方法)

    NSArray中存放的是NSDictionary,可以使用策略的方法对NSDictionary进行定制,增加比较的方法.然后调用NSArray的sortUsingSelector方法对数组进行排序,这 ...

  7. Ext.Ajax.request和formPanel.getForm().submit()两种提交方法的异同:

    Ext.Ajax.request和formPanel.getForm().submit()两种提交方法的异同: 1. 相同点: a) 都是使用异步提交的方式: b) 默认都是使用POST方式来提交数据 ...

  8. java代码二进制转为十六进制_Java 中二进制转换成十六进制的两种实现方法

    Java 中二进制转换成十六进制的两种实现方法 每个字节转成16进制,方法1 /** * 每个字节转成16进制,方法1 * * @param result */ private static Stri ...

  9. python ioc di_Spring介绍,IOC(控制反转),DI(依赖注入)介绍及两种注入方法

    Spring介绍,IOC(控制反转),DI(依赖注入)介绍及两种注入方法 第一中方法:在xml文件中注入: (1)开源的轻量级的应用开发框架 特点:a.简化开发:b.解耦:c.集成: 原理对象与对象之 ...

最新文章

  1. 和12岁小同志搞创客开发:如何选择合适的控制器?
  2. Chrome Extension 检查视图(无效)处理方法
  3. python2的默认数字类型_伪·从零开始学Python - 2.2.1 基本数据类型 - 整型与浮点型...
  4. iOS之UI--涂鸦画板实例
  5. 成功解决AttributeError: 'list' object has no attribute 'ndim'
  6. 网页版登录入口_企业微信网页版怎么登录?企业微信客户端和网页版有什么区别?...
  7. Go语言参数校验(go-playground / validator)
  8. 使用权重如何让一个控件的宽度为父控件的 1/3?
  9. 【JS 逆向百例】PEDATA 加密资讯以及 zlib.gunzipSync() 的应用
  10. 自己制作精美的App Store 软件截屏
  11. php删除数组中相同的元素,只保留一个相同元素
  12. 无法将mysql服务器连接到_无法从java连接到mysql服务器
  13. [转载] Python字符串isdecimal() isdigit()isnumeric()等判断方法的区分。
  14. Android5.0 netd架构流程
  15. python 字符串处理_python 数据清洗之字符串处理
  16. Gaussian Mixture Model
  17. mac下安装mysql 5.7.11卡住_Mac 安装mysql5.7 注意事项
  18. 微软Media Creation Tool 创建工具 1.3 升级:支持全新下载安装Win11 22H2 Build 22621.525
  19. 结合百度地图城市编码的数据表
  20. 计算机故障诊断知识,故障诊断

热门文章

  1. 你是DDoS攻击的受害者吗?
  2. [AD17] 使用元器件向导为元件绘制PCB封装
  3. 【Akka】Akka Actor生命周期
  4. 非地面无线通信网络的增强技术
  5. 上海房价地图热传:数据挺新 但不科学
  6. android电子书小程序,小程序安卓手机无法打开pdf(解决)
  7. 对话 MySQL 之父 Monty:超越 MySQL 很难,但我做到了!
  8. Delphi2010 的Google在线翻译
  9. C. Electrification(尺取)
  10. C语言程序怎么读取亮度值,颜色空间RGB与 色调、饱和度、亮度(ESL)转换的完整C语言算法...