问题描述:

设有n个人围坐在一个圆桌周围,现从第s个人开始报数,数到第m个的人出列,然后从出列的下一个人重新开始报数,数到第m个的人又出列,.......,如此反复直到所有的人出列为止。

Josephus.c

 #include <stdio.h>
#include <stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList; void CreateList(LinkList *l,int n)
{
int i;
LinkList p,tail;
for(i = ;i <= n;i++)
{
p = (LinkList)malloc(sizeof(LNode));
p->data = i; if(i == )
{
*l = p;
tail = *l;
}
else
{
tail->next = p;
}
tail = p;
}
tail->next = *l;
} void PrintList(LinkList l)
{
LinkList p;
p=l;
printf("初始化:");
while(p->next != l)
{
printf("%d ",p->data);
p = p->next;
}
printf("%d\n",p->data);
} void DelElem(LinkList l)
{
LinkList p;
p = l->next;
l->next = p->next;
printf("%d",p->data);
free(p);
} LinkList LocatePos(LinkList l,int m)
{
LinkList p = l;
int i;
for(i = ;i < m;i++)
{
p = p->next;
}
return p;
} void Josephus(LinkList l,int n,int s,int m)
{
LinkList p,q;
p = LocatePos(l,s);
while(p->next != p)
{
if(m == )
{
q = LocatePos(p,n--);
}
else
{
q =LocatePos(p,m-);
}
DelElem(q);
p = q->next;
}
printf("%d",p->data);
}
int main()
{
int n,s,m;
LinkList l;
printf("总人数:");
scanf("%d",&n);
CreateList(&l,n);
PrintList(l);
printf("第几个人开始报数:");
scanf("%d",&s);
printf("数到第几个人出列:");
scanf("%d",&m);
Josephus(l,n,s,m);
return ;
}

Josephus.cpp

 #include <iostream>
#include <cstdlib>
using namespace std;
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList; LinkList CreateList(LinkList &l,int n)
{
LinkList tail,p;
int i;
for(i = ;i <= n;i++)
{
p = (LinkList)malloc(sizeof(LNode));
p->data = i;
if(i == )
{
l = p;
tail = l;
}
else
{
tail->next = p;
}
tail = p;
}
tail->next = l;
} void PrintList(LinkList l)
{
LinkList p = l;
while(p->next != l)
{
cout<<p->data<<" ";
p = p->next;
}
cout<<p->data<<endl;
} void DelElem(LinkList p)
{ LinkList q;
q = p->next;
p->next = q->next;
cout<<q->data<<" ";
free(q);
} LinkList LocatePos(LinkList l,int k)
{
int i;
LinkList p = l;
for(i = ;i < k;i++)
{
p = p->next;
}
return p;
} void Josephus(LinkList l,int n,int s,int m)
{
LinkList p,q;
p = LocatePos(l,s);
cout<<"输出顺序:";
while(p != p->next)
{
if(m == )
q = LocatePos(p,n--);
else
q = LocatePos(p,m-);
DelElem(q);
p = q->next; }
cout<<p->data<<endl;
free(p);
}
int main()
{
LinkList l;
int n,s,m;
cout<<"总人数:";
cin>>n;
CreateList(l,n);
cout<<"初始化:";
PrintList(l);
cout<<"第几个人开始报数:";
cin>>s;
cout<<"数到第几个人出列:";
cin>>m;
Josephus(l,n,s,m);
return ;
}

循环链表Josephus问题(c,cpp)的更多相关文章

  1. 用循环链表实现Josephus问题

    Josephus问题:设有n个人围坐在一个圆桌周围,现从第s个人开始报数,数到第m的人出列,然后从出列的下一个人重新开始报数,数到第m的人又出列.如此反复直到所有的人全部出列为止. 思路:构建一个没有 ...

  2. Josephus环类问题,java实现

    写出一个双向的循环链表,弄一个计数器,我定义的是到三的时候,自动删除当前节点,很简单. package Com; import java.util.Scanner; /* * 约瑟夫环问题,有n个人组 ...

  3. 约瑟夫(环)问题(Josephus problem)

    问题描述:皇帝决定找出全国中最幸运的一个人,于是从全国选拔出 n 个很幸运的人,让这 n 个人围着圆桌进餐,可是怎么选择出其中最幸运的一个人呢?皇帝决定:从其中一个人从 1 开始报数,按顺序数到第 k ...

  4. 1009: josephus问题

    1009: josephus问题 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 549  Solved: 227 Description josephus ...

  5. 华为面试题——约瑟夫问题的C++简单实现(循环链表)

    /*     author:jiangxin     Blog:http://blog.csdn.net/jiangxinnju     Function:method of Josephus que ...

  6. josephus问题

    问题描述 n个人围成一圈,号码为1-n,从1开始报数,报到2的退出,剩下的继续从1开始报数,求最后一个人的号码. 算法分析 最直观的算法是用循环链表模拟.从首节点开始,不断删除第二个节点,直到只剩一个 ...

  7. Josephus

    利用循环链表模拟约瑟夫问题,把自杀的人的顺序排列出来 代码如下: #include<stdio.h> #include<stdlib.h> typedef int status ...

  8. 约瑟夫问题(Josephus Problem)的两种快速递归算法

    博文链接:http://haoyuanliu.github.io/2016/04/18/Josephus/ 对,我是来骗访问量的!O(∩_∩)O~~ 约瑟夫问题(Josephus Problem)也称 ...

  9. 习题3.10 约瑟夫环 josephus问题

    /* assume a header */ /* 双向循环链表 */ struct Node; typedef struct Node * PtrToNode; typedef PtrToNode L ...

随机推荐

  1. KindEditor得不到textarea值的解决方法----摘至天涯

    以前有朋友遇到过这个问题,就是KindEditor在火狐下或者其他浏览器下都无法得到textarea文本框的值,点击表单提交按钮得到的是空白.昨天天涯PHP博客[http://blog.phpha.c ...

  2. JS URL 使用base64加密与解密

    JS编码方式: <script type="text/javascript"> document.write(encodeURI("http://www.w3 ...

  3. [git]Git与Repo入门

    转自:http://www.cnblogs.com/angeldevil/archive/2013/11/26/3238470.html 注:非常推荐的一篇关于git的博文 目录: 版本控制 一.原始 ...

  4. scala高级内容(二) - Implicit

    一. Implicit关键字 隐士转换 (1)隐士转换函数:用implicit修饰的,只有一个参数的函数.他会被自动执行,来把一个值转换成另一个 class RichFile(val f:File){ ...

  5. SpringMVC4.0.3 @ResponseBody JSON 中文乱码问题

    @RequestMapping(value="listUserJson.html",produces="text/html;charset=UTF-8") @R ...

  6. android按钮监听器的四种技术

    android开发中经常会用到各种各样的监听器,android监听器的写法与java又有不同的地方; 1,activity中使用内部类实现接口 ,创建内部类实例  使用add方法  与java类似 创 ...

  7. EditText获取焦点显示输入法时布局自动改变的解决方案

    最近在调试Android时,发现当屏幕下方的EditText获取焦点,显示输入法时候.页面布局重新调整而不是整体上移.导致部分控件显示不完全. 最终解决方案是修改项目AnroidManifest.xm ...

  8. 跨域请求 & jsonp

    0 什么是跨域请求 在一个域名下请求另外一个域名下的资源,就是跨域请求.example 1:比如:我当前的域名是http://che.pingan.com.我现在要去请求http://www.cnbl ...

  9. by which, in which, from which 语法区别

    (1)Here is Beijing,where I grow up.where其实也是指代北京,不过where是在北京的意思,也就是 in Beijing (2)Here is Beijing,in ...

  10. {JavaScript}栈和堆内存,作用域

    1.栈 stack”和“堆 heap”:         简单的来讲,stack上分配的内存系统自动释放,heap上分配的内存,系统不释放,哪怕程序退出,那一块内存还是在那里.stack一般是静态分配 ...