为了账号安全,请及时绑定邮箱和手机立即绑定

C++链表开发问题

C++链表开发问题

尚方宝剑之说 2019-04-19 16:11:35
#includeusingnamespacestd;structchild{intnum;child*link;};;voidinit(intn);;voidgameStart(intn,intm);child*head;child*present;child*end;;intmain(){intn,m;coutn;coutm;init(n);gameStart(n,m);coutlink;deletepresent;present=pGuard->link;n--;}}这是个约瑟夫环问题我想问下present->link=head;end=present;present=head;具体什么意思貌似是将首尾相连形成循环链表吧。。请详细解释下。。谢谢!求解。。
查看完整描述

2 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

@洃c小强大半夜的看到这道题目,我来补充一下吧。
约瑟夫环的问题是说,有编号为1..n的n个犯人围坐成一圈报数,报数为m的犯人出列被kill掉,然后刚才出列犯人的下一位从1开始报数,以此类推,最终只剩一个人为止。并报告此人的编号g(n,m)。
这是计算机算法的一道经典题目。
常规的解法是根据题目进行建模。
其中
structchild{
intnum;
child*link;
};
是犯人的模型,每个犯人有一个编号num,同时有下一个编号犯人的指针link,这样,能够建立一个单向链表。
但是,约瑟夫环是首尾循环的,所以,需要present->link=head;来将单向链表变成环链表。
完成模型建构以后,需要指定开始和结束的位置
end=present;
present=head;
就是用来完成这一功能的。
之后的gameStart就是完成根据条件删除链表节点的功能。
除去约瑟夫环的背景,其实,这段程序的基本功能只有两个:1.构建环链表;2.根据条件删除环链表节点;
这样程序就容易理解多了。^-^
另外,题目中的解法是利用模拟的办法来解决约瑟夫环的问题的。其实,在数学上,关于约瑟夫环g(n,m)=?是有直接答案的。
g(n,m)=(g(n–1)+m)%n,(n>1)
用Python写出的代码如下:
defjosephus(n,m):
j=0
foriinrange(2,n+1):
j=(j+m)%i
printj+1
大概就是这些吧。
                            
查看完整回答
反对 回复 2019-04-19
?
万千封印

TA贡献1891条经验 获得超3个赞

我没仔细看也不懂约瑟夫环也不会c++.不过看样子是
present->link=head;
end=present;
present=head;
这三句话的意图是重置present与present的link还有end指针使之都指向链表头而已,也就是说这时候约瑟夫环已经构建完毕,可以把指针都设置为链表初始值以待后用了,再看看函数名为init,我想我的推测完全没错
                            
查看完整回答
反对 回复 2019-04-19
  • 2 回答
  • 0 关注
  • 423 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信