C语言:约瑟夫问题——使用循环链表解决

本文通过C语言实现约瑟夫问题,创建一个循环链表,模拟30名乘客超载船只的情况,每数到第9名乘客将其移除,直至剩余15人。程序包括链表初始化、删除操作、结果打印及输出到txt文件等步骤,展示了链表操作和文件处理的基本技巧。

传说有30个乘客同乘一条船,因为严重超载,加上风浪水作,危险万分。船长告诉乘客,只有将全船一半的乘客投入海 中,其余人才能幸免于难。他们约定了一个规则:30个人围成一圈,由第一个人数起,依次报数,数到第9个人,便把他投入大海中,然后再从他的下一个人数起,数到第9个人,再将其扔下大海,如此循环地进行,直到剩下15个乘客为止。请问哪些位置是将被扔下大海的位置,留下的是谁。

(由这个传说产生了约瑟夫问题,总数n,删除数为k)

最后我写了一个函数是将结果输出到外部文本txt中。

我所写出的循环链表是基于单链表来写的简而言之就是,首先,生成我们所学过的单链表(我这里采用的是头插法),每次生成一个空间,就将该空间的成员信息进行赋初值,也就是把结构里面所定义的成员的位置信息进行赋值(如:第一个成员的位置信息就是1,接下去就是2,3,4....)

PS:需要注意的是,我这里是头插法,所以我在位置信息的时候是从30开始,最后整个单链表生成之后就是从1开始的一个正向顺序的链表。 当然你也可以选择把整个单链表生成之后再进行赋值,这样可能会更清晰,我这里是边想边写,就没有考虑到这么多。

准备工作完成之后,你就可以把单链表的尾部指针,和头部指针,将这两个指针连接起来(尾部指针就是指向NULL的那个指针),记住一定是尾部指针指向头部指针,也

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

竹等寒

谢过道友支持,在下就却之不恭了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值