约瑟夫环数据结构c语言程序,C语言约瑟夫环的实现

本文介绍了一个经典的计算机科学问题——约瑟夫问题,并使用C语言中的循环链表进行了解决方案的实现。约瑟夫问题讲述了一群人围成一圈按一定规则淘汰成员直至最后一名成员的场景。文中提供了完整的代码示例,包括建立循环链表、执行约瑟夫规则并最终打印结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C语言约瑟夫环的实现

一、典故:

据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是商量了一个自杀方式:

41个人排成一个圆圈,由第1个人 开始报数,每数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,Josephus要 他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。

二、用循环链表实现

1.约瑟夫环实现

sListNode* JosephCycle(sListNode* pHead, DataType x)

{

if(pHead == NULL)

return NULL;

sListNode* cur = pHead;

while(1)

{

DataType m = x;

if(cur->next == cur)

{

return cur;

}

while(--m)

{

cur = cur->next;

}

//delete替换法

cur->data = cur->next->data;

sListNode* del = cur->next;

cur->next = cur->next->next;

free(del);

del=NULL;

}

2.测试

void TestJosephCycle()

{

sListNode* list = NULL;

Push_Back(list, 1);

Push_Back(list, 2);

Push_Back(list, 3);

Push_Back(list, 4);

Push_Back(list, 5);

Push_Back(list, 6);

Push_Back(list, 7);

Push_Back(list, 8);

Push_Back(list, 9);

PrintList(list);

//建环

sListNode* cur = list;

while(cur->next != NULL)

{

cur = cur->next;

}

cur->next = list;

sListNode* ret = JosephCycle(list, 3);

cout<data<

//解环

free(ret); //明确知道只有一个节点,直接释放

ret = NULL;

}

以上就是约瑟夫环的简单实现,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值