问题描述:

设有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. js常见数字处理整理

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...

  2. c++中字符串处理函数

    c++11中提供了to_string函数,定义在string中, 重载了一大片, std::string to_string( int value ); () (since C++) std::str ...

  3. 【SQL Server】系统学习之一:表表达式

    本节讨论的相关内容包括:视图.派生表.CTE.内联表值函数 场景:如果要查询一组数据(例如聚合数据,也就是几个表聚合在一起的数据),这些数据并未在数据库中以表的形式存在. 1.视图:通常用来分解大型的 ...

  4. Jedis 连接redis超时

    redis默认不允许远程连接 用vi打开Redis服务器的配置文件redis.conf ~ sudo vi /etc/redis/redis.conf #注释bind #bind 127.0.0.1 ...

  5. 将网站部署到windows2003 iis6之后,出现asp.net程序页面无法访问情况

    idc的技术说是没有装.net framework 2.0的缘故. 可是我已经装了4.0. 后来把一个伪静态的组件卸载了,就可以了.

  6. 最大熵的Java实现

    这是一个最大熵的简明Java实现,提供训练与预测接口.训练采用GIS训练算法,附带示例训练集.本文旨在介绍最大熵的原理.分类和实现,不涉及公式推导或其他训练算法,请放心食用. 最大熵理论 简介 最大熵 ...

  7. Unix_Linux系统定时器的应用(案例)

    2014-05-05 Created By BaoXinjian

  8. Form_Form与OAF页面互相调用(案例)

    2014-12-27 Created By BaoXinjian

  9. PLSQL_性能优化效能跟踪工具SQL Trace分析(案例)

    2014-06-25 Created By BaoXinjian

  10. python(12)给文件读写上锁

    目的:当我们用脚本去爬取数据或者向文件中写数据的时候,有时候需要两个或者多个脚本同时向一个文件中读写 于是乎就会出现写乱的情况,于是乎我们就需要把正在写的文件先锁起来,只让当前的写,写完后再释放 代码 ...