试编写一个求解Josephus问题的函数 50

用整数序列1,2,3,...,n表示顺序围坐在圆桌周围的人,并采用数组表示作为求解过程中使用的数据结构。然后使用n=9,s=1,m=5,以及n=9,s=1,m=0或者n=... 用整数序列1,2,3,...,n表示顺序围坐在圆桌周围的人,并采用数组表示作为求解过程中使用的数据结构。然后使用n=9,s=1,m=5,以及n=9,s=1,m=0或者n=9,s=1,m=10作为输入数据,验证程序的正确性。(用C语言) 展开
 我来答
涵藕丝
2010-05-04 · TA获得超过136个赞
知道答主
回答量:194
采纳率:0%
帮助的人:103万
展开全部
#include <stdio.h>

#include <alloc.h>

struct circle

{

int number;

struct circle *next;

};

struct circle * creat_j(int n) /* 建立有n个结点的循环链表 */

{

int i;

struct circle *head,*new,*p;

new=(struct circle *)malloc(sizeof(struct circle));

new->number=1;

head=new; /* 生成链表的头指针 */

p=new;

for(i=2;i<=n;i++) /* 该循环生成链表的第2到第n个结点 */

{

new=(struct circle *)malloc(sizeof(struct circle));

new->number=i;

p->next=new;

p=new;

}

p->next=head; /* 建立循环链表 */

return(head); /* 返回头指针的值作为函数值 */

}

void josephus(struct circle head,int m) /* 利用循环链表解决Josephus问题的函数 */

{

struct circle *p,*q,*temp;

int i=1;

q=p=head;

while(p!=p->next) /* 当链表中多于一个结点时,就一直数下去 */

{

if(i==m) /* 数到m的结点从链表中删除 */

{

printf("%5d",p->number); /* 输出编号 */

q->next=p->next;

temp=p;

p=p->next; /* 下一个结点为下一论数数的起点 */

free(temp);

i=1;

}

else /* 继续向下数数 */

{

q=p;

p=p->next;

i++;

}

}

printf("%5d",p->number); /* 输出最后一个结点的编号 */

}

main()

{

int n,m;

struct circle *head;

printf("Enter n,m:");

scanf("%d,%d",&n,&m);

head=creat_j(n); /* 创建循环链表 */

josephus(head,m); /* 解决Josephus问题 */

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式