当前位置:启航官网 > 考研报考 > 试题

【难】约瑟夫问题:m个人依次编号为1-m,他们围成一圈,从编号为1的人开始沿编号

【难】约瑟夫问题:m个人依次编号为1-m,他们围成一圈,从编号为1的人开始沿编号增加方向报数,数到n的人出圈,然后继续从1开始报数,数到n的人继续出圈,这样直到圈中只剩下最后一人。以下算法函数,用单向循环链表求解该问题,函数返回值为圈中最后一人的编号,请填空使程序完整。

已知链表结点及结点指针数据类型定义如下:

typedef struct node {

int no; /*人的编号*/

struct node *next;

} LNode, *LPtr;

int Joseph(int m, int n) "分析时可以 m = 8, n = 3为例”

{/*创建单向循环链表*/

LPtr h, last, p, pr; int i;

/*创建单向循环链表*/

h = (LPtr) malloc(sizeof(LNode) ) ; h->no = 1;

last = h;

for(i = 2; i< = m; i++)

{

p = (LPtr) malloc(sizeof(LNode) ) ; p->no =   (9) 

last->next =   (10)  ; last = p;

}

last->next = h;

/*数到n的人出圈(从循环链表中删除),直到循环链表只剩下一个结点*/

pr = last;

while(pr->next! = pr)

{

for{i = l;i< =   (11)  ;i++) pr = pr->next; /*pr 推进到出圈人的直接前趋*/

p = pr->next; /* p指向出圈人(被删除结点) */   (12) 

free((void *) p) ; /* 删除出圈人*/

}

return pr->no;/*返回圈中最后一人的编号*/

}

查看答案和解析

【26考研辅导课程推荐】:26考研集训课程,VIP领学计划,26考研VIP全科定制套餐(公共课VIP+专业课1对1) , 这些课程中都会配有内部讲义以及辅导书和资料,同时会有教研教辅双师模式对大家进行教学以及督学,并配有24小时答疑和模拟测试等,可直接咨询在线客服老师领取大额优惠券。

免责声明:本平台部分帖子来源于网络整理,不对事件的真实性负责,具体考研相关内容请以各院校的官网通知为准。 如果本站文章侵犯到您的权利,请联系我们(400-108-7500)进行删帖处理。

启航教育热门私房课

MORE
  • 26考研VIP领学计划

    全程跟进
    形式:线上+线下
     

    查看详情

    在线咨询

  • 25考研专属VIP班

    联报优惠
    形式:线上
     

    查看详情

    在线咨询

  • 25在职考研课程

    专为在职人定制
    形式:线上
     

    查看详情

    在线咨询

2025考研

小班面授 名额有限 抢先体验

点击预约 

为你推荐