约瑟夫环问题 c语言程序

[问题描述]设有n个人围坐一圈,从某个人开始报数,数到m的人出列,接着下从下一个人开始从新报数,数到m的人又出列,直到所有的人出列为止。输出出队列的顺序。[具体要求](1... [问题描述]
设有n个人围坐一圈,从某个人开始报数,数到m的人出列,接着下从下一个人开始从新报数,数到m的人又出列,直到所有的人出列为止。输出出队列的顺序。
[具体要求]
(1)要求建立一个由n个人围坐的一个圈(链式循环队列),编号依次为1、2、...、n
(2)从第i个人开始报数,数到m的人出列
(3)人数n、初始报数人编号、m的值由
#include <stdio.h>
#define S() sizeof(struct quene)
typedef struct quene
{ int n;
struct quene *next;
} QUE;
QUE * fun1(int n);
int fun2(QUE *p);
int main()
{ int m,i,n,j,s;
QUE *p,*p2;
printf("n=");
scanf("%d",&n);
printf("m=");
scanf("%d",&m);
printf("i=");
scanf("%d",&i);
p=fun1(n);
for(j=1;j<i;p=p->next,j++);
j=1;p2=p;
while((p->next)!=p)
{ p=p->next;
if(++j==m)
{ j=1;p=p->next;
s=fun2(p2);
printf("%d ",s);
}
p2=p;
}
printf("%d\n",p->n);
}
QUE * fun1(int n)
{ QUE *head,*p1,*p2;
int i;
for(i=1;i<=n;i++)
{ p1=(QUE *)malloc(S());
if(i==1) head=p1;
else p2->next=p1;
p1->n=i;
p2=p1;
}
p1->next=head;
return head;
}
int fun2(QUE *p)
{ QUE *p2;
int n;
p2=p->next;
n=p2->n;
p->next=p2->next;
free(p2);
return n;
}
展开
 我来答
别动队领导
2009-05-30 · TA获得超过399个赞
知道小有建树答主
回答量:172
采纳率:0%
帮助的人:300万
展开全部

已经修改好了。上次调试程序调试的不仔细,这次应该没问题了,如果有的话再跟我联系。 

#include <stdio.h> 

#define S() sizeof(struct quene) 

typedef struct quene 

{ int n; 

struct quene *next; 

} QUE; 

QUE * fun1(int n); 

int fun2(QUE *p); 

int main() 

{ int m,i,n,j,s; 

QUE *p,*p2; 

printf("n="); 

scanf("%d",&n); 

printf("m="); 

scanf("%d",&m); 

printf("i="); 

scanf("%d",&i); 

p=fun1(n); 

for(j=1;j<i;p=p->next,j++); 

j=1;p2=p; 

while((p->next)!=p) 

{ p=p->next; 

if(++j==m) 

{ j=1;p=p->next; 

s=fun2(p2); 

printf("%d ",s); 

p2=p; 

printf("%d\n",p->n); 

QUE * fun1(int n) 

{ QUE *head,*p1,*p2; 

int i; 

for(i=1;i<=n;i++) 

{ p1=(QUE *)malloc(S()); 

if(i==1) head=p1; 

else p2->next=p1; 

p1->n=i; 

p2=p1; 

p1->next=head; 

return head; 

int fun2(QUE *p) 

{ QUE *p2; 

int n; 

p2=p->next; 

n=p2->n; 

p->next=p2->next; 

free(p2); 

return n; 

}

fhefh5566
推荐于2017-10-11 · TA获得超过727个赞
知道小有建树答主
回答量:508
采纳率:0%
帮助的人:368万
展开全部
#define N 10
int yuesefu1(int data[],int sum,int k)
{
int i=0,j=0,count=0;
while(count<sum-1)
{
if(data[i]!=0)/*当前人在圈子里*/
j++;
if(j==k)/*若该人应该退出圈子*/
{
data[i]=0;/*0表示不在圈子里*/
count++;/*退出的人数加1*/
j=0;/*重新数数*/
}
i++;/*判断下一个人*/
if(i==sum)/*围成一圈*/
i=0;
}
for(i=0;i<sum;i++)
if(data[i]!=0)
return data[i];/*返回最后一个人的编号*/
}

void main()
{
int data[N];
int i,j,total,k;
printf("\nPlease input the number of every people.\n");
for(i=0;i<N;)/*为圈子里的人安排编号*/
{
int input;
scanf("%d",&input);
if(input==0)
break;/*0表示输入结束*/
for(j=0;j<i;j++)/*检查编号是否有重复*/
if(data[j]==input)
break;
if(j>=i&&input>0)/*无重复,记录编号,继续输入*/
{
data[i]=input;
i++;
}
else
printf("\nData error.Re-input:");
}
total=i;
printf("\nYou have input:\n");
for(i=0;i<total;i++)
{
if(i%10==0)
printf("\n");
printf("%4d",data[i]);
}
printf("\nPlease input a number to count:");
scanf("%d",&k);
printf("\nThe last one's number is %d",yuesefu1(data,total,k));
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式