循环链表Josephus问题(c,cpp)
问题描述:
设有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)的更多相关文章
- 用循环链表实现Josephus问题
Josephus问题:设有n个人围坐在一个圆桌周围,现从第s个人开始报数,数到第m的人出列,然后从出列的下一个人重新开始报数,数到第m的人又出列.如此反复直到所有的人全部出列为止. 思路:构建一个没有 ...
- Josephus环类问题,java实现
写出一个双向的循环链表,弄一个计数器,我定义的是到三的时候,自动删除当前节点,很简单. package Com; import java.util.Scanner; /* * 约瑟夫环问题,有n个人组 ...
- 约瑟夫(环)问题(Josephus problem)
问题描述:皇帝决定找出全国中最幸运的一个人,于是从全国选拔出 n 个很幸运的人,让这 n 个人围着圆桌进餐,可是怎么选择出其中最幸运的一个人呢?皇帝决定:从其中一个人从 1 开始报数,按顺序数到第 k ...
- 1009: josephus问题
1009: josephus问题 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 549 Solved: 227 Description josephus ...
- 华为面试题——约瑟夫问题的C++简单实现(循环链表)
/* author:jiangxin Blog:http://blog.csdn.net/jiangxinnju Function:method of Josephus que ...
- josephus问题
问题描述 n个人围成一圈,号码为1-n,从1开始报数,报到2的退出,剩下的继续从1开始报数,求最后一个人的号码. 算法分析 最直观的算法是用循环链表模拟.从首节点开始,不断删除第二个节点,直到只剩一个 ...
- Josephus
利用循环链表模拟约瑟夫问题,把自杀的人的顺序排列出来 代码如下: #include<stdio.h> #include<stdlib.h> typedef int status ...
- 约瑟夫问题(Josephus Problem)的两种快速递归算法
博文链接:http://haoyuanliu.github.io/2016/04/18/Josephus/ 对,我是来骗访问量的!O(∩_∩)O~~ 约瑟夫问题(Josephus Problem)也称 ...
- 习题3.10 约瑟夫环 josephus问题
/* assume a header */ /* 双向循环链表 */ struct Node; typedef struct Node * PtrToNode; typedef PtrToNode L ...
随机推荐
- Zabbix agent on Microsoft Windows
1.在Windows上创建目录: C:\Windows\zabbix\ 2.下载安装包并解压到新建的目录 3.下载地址:http://www.zabbix.com/downloads/3.0.0/za ...
- 黄聪:C#设置窗体打开位置(在显示器的右下角打开)
; ; this.SetDesktopLocation(x, y); 注释:System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Size.Wid ...
- (C++) Interview in English. - Constructors/Destructors
Constructors/Destructors. 我们都知道,在C++中建立一个类,这个类中肯定会包括构造函数.析构函数.复制构造函数和重载赋值操作:即使在你没有明确定义的情况下,编译器也会给你生成 ...
- SpringMVC参数类型转化错误调试方法
- OAF_架构MVC系列4 - Control的概述(概念)
2014-06-18 Created By BaoXinjian
- linux下sublime配置c++11编译环境
Tools->Build System->New Build System { "cmd": ["g++", "-std=c++11&qu ...
- memcache 内部原理实现
Lazy Expiration memcached 内部不会监视记录是否过期,而是在 get 时查看记录的时间戳,检查记录是否过期.这 种技术被称为 lazy(惰性)expiration.因此,mem ...
- shell中实现自动登录(bash环境脚本中)
自己的脚本: #!/bin/bash expect -c " set timeout 3600; spawn su -; expect *assword:*; ...
- centos update git(转载)
From:http://itekblog.com/update-git-centos/ 1.下载RPMForge repo cd /tmp # bit: wget http://pkgs.repofo ...
- 原始ajax发起请求并反馈
在用户登陆的时候,离开用户.密码输入框即进行验证:ajax发起请求进行验证的: login.jsp代码: <%@ page language="java" contentTy ...