刚刚学编程的小菜鸟 请教大大们一个约瑟夫环程序 不太会
1、问题描述:约瑟夫(joseph)问题的一种描述是:编号为1、2、…、n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m。从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列。将他的密码作为新的m的值,从他在顺时针方向上方的下一个人开始重新报数,如此下去,直至所有人全部出列为止。式设计一个程序求出出列顺序。#include <stdio.h>
#include <stdlib.h>
typedef struct Lnode{
int data;
int num;
struct Lnode *next;
}*linklist;
void initlist(linklist &L,int a[],int n)
{
linklist s,r;int i;
L=(linklist)malloc(sizeof(linklist));
L->next=NULL;
r=L;
for(i=0;i<n;i++)
{
s=(linklist)malloc(sizeof(linklist));
s->data=a[i];
s->num=i+1;
r->next=s;
r=s;
}
r->next=L;
}
int delete_and_get(linklist L,int x,int &e)
{
int i=0;int j;
linklist p=L->next,q;
while(p->next!=NULL && i<x-1)
{
p=p->next;
i++;
}
if(!(p->next)||i>x-1)
return -1;
q=p->next;
p->next=q->next;
e=q->data;j=q->num;
free(q);
printf("被读出来的人是%d",j);
return e;
}
int main()
{
int i,m,n;int a[100];
linklist L;
printf("请输入人数和每个人的密码");
scanf("%d %d/n",&m,&n);
for(i=0;i<n;i++)
{
scanf("%d ",&a[i]);
}
delete_and_get(initlist(*L, a, n),m);
return 0;
}
能不能帮帮忙 快哭了—----