作者热门文章
- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章C语言约瑟夫环的实现由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
C语言约瑟夫环的实现 。
1、典故
据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是商量了一个自杀方式:
41个人排成一个圆圈,由第1个人 开始报数,每数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,Josephus要 他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏.
2、用循环链表实现 。
1.约瑟夫环实现 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
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.测试 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
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<<
"Joseph:"
<<ret->data<<endl;
//解环
free
(ret);
//明确知道只有一个节点,直接释放
ret = NULL;
}
|
以上就是约瑟夫环的简单实现,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持! 。
原文链接:http://blog.csdn.net/xhfight/article/details/51550451 。
最后此篇关于C语言约瑟夫环的实现的文章就讲到这里了,如果你想了解更多关于C语言约瑟夫环的实现的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
Josephu (约瑟夫,约瑟夫环) 问题,是一个计算机科学和数学中的问题,在计算机编程的算法中,类似问题又称为约瑟夫环,又称 “丢手绢问题”。 据说著名犹太历史学家Josephus有过以下的故事 在
我是一名优秀的程序员,十分优秀!