作业帮 > 综合 > 作业

求C语言实现约瑟夫环!

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/07/05 21:06:59
求C语言实现约瑟夫环!
1.编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人持有一个密码(正整数).一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数.报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止.设计一个程序来求出出列顺序.
2.基本要求:利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号.程序开始执行时输入人数n及各人密码和m的初值,得出输出序列.
我在网上找到一些代码,但是不是很懂,求有详细注释的代码(就是中间过程基本都有注释的),
我们学校OJ上面提交通过了的.就是一个链表里面 存储四个变量sum:序列编号也就是这是第几个数2.number:这个数的值3.flag先全部赋值为1,如果被抽到就赋值为0表示被踢出去了.这类型的指针你要是要注释,待会有空写.

#include <stdio.h>
#include "stdlib.h"
#include<iostream>
using namespace std;
#include<cstdlib>

typedef struct DNode
{
int sum;
int number;
int flag;
struct DNode *next;
}sqlist;

sqlist *head,*up,*down,*down2;
int sum1=1;
int n;

void insert(int data)
{

sqlist *up=(sqlist *)malloc(sizeof(sqlist));
if (head==NULL)
{   
down=head=up;
head->sum=sum1++;
up->number=data;
up->flag=1;

head->next=NULL;

}
else 
{   
down->next=up;
up->sum=sum1++;
up->number=data;
up->flag=1;

up->next=NULL;
down=up;
}

}

void  FindAndrePlace(int k)
{

int sum=0,sn=1,snn=n;

up=head;

while(n--)
{
while(1)
{
if(up->flag==1)
{
sum++;


if(sum==k&&up->flag==1)
{    
if(sn==snn)
{printf("%d",up->number);}
sn++;
up->flag=0;
sum=0;
break;
}

     if(up->next==NULL){up=head;}
else {up=up->next;}
}

}
}

int main()
{
down=up=head=NULL;

    int data,k,i;
cin>>n;

for(i=1;i<=n;i++)
{
data=i;
insert(data);
}

int local=1;
cin>>k;
if(n==1){printf("1");}
else{
FindAndrePlace(k);}
return 0;

}