约瑟夫环问题的代码

我用的vc 6.0++,表示数据结构不通,求大侠修改#include
#include<stdio.h>
#define N 100
void OutRing(int n, int quit[N]);
//数据结构设计//
typedef struct node{
int number;//每个人的编号
struct node *next;//指向下一个人的结点
}Lnode, *Linklist;
Linklist p;//设头指针p

Linklist InitRingLList(int n);
void Josephus(Linklist R, int n, int k, int quit[N]);

void main(){
int quit[N];
int n,k,m;
printf("enter :");
scanf("%d %d %d",&n,&k,&m);
p=InitRingLList(n);
Josephus(p,n,k,quit[N]);
OutRing(n,quit[N]);
}

//建立单循环链表函数与初始化//
Linklist InitRingLList(int n){ //尾插法建立//n代表总人数
Lnode *R, *p, *q;
int i;
R = new Lnode;
q = R;
for (i = 1; i < n; i++){
p = new Lnode;
q->number = i;
q->next = R;
q = p;
}
p->number = n;
p->next = R;//链表首尾相连
R = p;//R指向循环链表尾结点
return R;
}

//删除结点和保存输出顺序的函数//
void Josephus(Linklist R, int n, int k, int quit[N]){ //从编号为k的人开始报数
int i, j;
Lnode *p, *q;
p = R;
for(i = 0; i < n; i++ ){
for (j = 1; j <= k - 1; j++)//沿链前进 k-1步
p = p->next;
q = p->next;//q为被删除结点
p->next = q->next;//删除结点
quit[i] = q->number;//保存编号
delete q;//释放空间// delete为保留字
}
}

//序列的输出函数
void OutRing(int n, int quit[N]){
int i;
for (i = 0; i < n; i++)
cout << quit[i];
}

void main(){
int n;
printf("请输入总人数:")
scanf("%d", &n);
int k;
printf("/n请输入开始编号")
scanf("%d", &k);
int m;
printf("/n请输入报数上限")
scanf("%d", &m);

}

第1个回答  2014-05-16
首先,这个代码输出的是,约瑟夫环到达的最后位置。输出结果是15。
//把iostream这个文件中的内容复制到这个地方。
#include<iostream>
using namespace std;
int main()
{
//定义一个常量的整形100,表示人的个数。
const int n=100;
//定义约瑟夫环的参数。
int m=30;
//定义一个数组,用于计算约瑟夫环的位置。
int a[n];

//给数组赋值,让数组的每个值就是这个元素的编号。
for(int j=0;j<n;j++)
a[j]=j+1;
//定义一个标志k,当K等于N的时候,表示到达约瑟夫环的最后位置。
int k=1;
int i=-1;
while(1)
{
for(int j=0;j<m;)
{
//不停的取数组的下一个元素。
i=(i+1)%n;
//如果这个元素没有被标记为0,说明这个位置还没有被排除,j加1,进入下一个循环
if(a[i]!=0)
j++;
}
//如果标志K等于n,说明约瑟夫环的循环到达最后一个位置,跳出While死循环。
if(k==n)
break;
//否则,把这个位置的元素设为零,标志它被排除。
a[i]=0;
//标志+1。
k++;
}
//输出约瑟夫环到达的最后一个位置。
cout<<a[i]<<endl;
return 0;
}本回答被提问者采纳

约瑟夫环代码解释
if(a[i]) \/\/a[i] 初值都是1,因此你注意,如果a[i]==0,则表示这个人已经出队了,不需要再数了

数据结构中的约瑟夫环问题用C语言怎么编写出来啊?
2.个人分析: 算法比较经典,对于这样的问题本应该使用链表的形式会比较容易.约瑟夫环算法 则体现了使用数组来完成链表该完成的功能,虽然形式上完全不相同,但却求出了 相同的结果.有异曲同工之妙.总之我个人认为是数组中非常经典的算法了.希望本 人写的代码不会叫大家啐骂!3.程序源代码:include <st...

约瑟夫环问题怎么解决啊?请用C语言写代码,谢谢!
include"MyNode.h" \/\/文件1 Node::Node( ){ next = NULL;} Node::Node(Node_entry item, Node *add_on){ entry = item;next = add_on;} --- include<iostream.h> \/\/文件2 typedef int Node_entry;struct Node { \/\/ data members Node_entry entry;Node *next;\/\/ constructor...

用C语言解决一个实际问题(不要太长)
约瑟夫环(很有名的数学问题)已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。void JOSEPHUS(int n,int k,int m) \/\/n为总人数,k...

顺序表解约瑟夫
用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序。(最好用单链表实现)这是一个约瑟夫环的问题,代码如下

约瑟夫问题
约瑟夫环:约瑟夫环问题的一种描述是:编号为1.2.3…….n的n个人按顺时针方向围坐一圈 ,每人手持一个密码(正整数),开始任意选一个整数作为报数上限值,从第一 个人开始顺时针自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密 码作为新的m值,从他顺时针下一个人开始重新从1开始...

约瑟夫环问题 经典求循环公式
提问时 应该把问题说清,不要只帖代码 要中说查错的话:cout <<"The winner is No."<<index<<".\\n";\/\/少了个后引号 while(count<M)\/\/ 对成功的报数开始计数 { index=(index+1)%N;\/\/计算要报数的小孩编号 这步谁能帮我分析下?if (in_circle[index])count++;} 这个循环的作用就是...

约瑟夫问题的一般形式
约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1。分析:(1)由于对于每个人只有死和活两种状态,因此可以用布朗型数组标记每个人的状态,可用true表示死,false表示活。(2...

java编程17人编号为0-16围成一圈,0号人开始从1报数,凡是报数为3倍数的...
这是一个约瑟夫环的问题 解答如下:依据提议,可以将题目等价变换为:“n(n=17)人编号为0到(n-1)围成一圈,0号人开始从0报数,凡是报数为m-1 (m=3)倍数的人离开圈子,继续到一个,问他编号”一开始的状态 0,1,2,3,4,5 ... (n-2), (n-1) 【n个人】第一个人被踢之后 设第...

用c语言实现约瑟夫环
正好之前写过基础的约瑟夫环,稍作修改就可以满足你的题目 include <stdio.h>#include <stdlib.h>typedef struct _node { int id; int key; struct _node *next;} Linklist;int main() {int n, m;scanf("%d %d", &n, &m);int i, count = 0;Linklist *head = (Linklist*...

相似回答