C语言约瑟夫环的实现

 更新时间:2017年08月11日 14:51:31   作者:XHfight  
这篇文章主要介绍了C语言约瑟夫环的实现的相关资料,这里主要是利用数据数据结果中循环链表来实现,需要的朋友可以参考下

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<<"Joseph:"<<ret->data<<endl; 
 //解环 
 free(ret); //明确知道只有一个节点,直接释放 
 ret = NULL; 
} 


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

相关文章

  • snprintf函数的用法解析

    snprintf函数的用法解析

    以下是对snprintf函数的具体使用方法进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-07-07
  • QT应用启动失败排查方法小结

    QT应用启动失败排查方法小结

    启动QT应用经常会碰到应用启动失败,qt platform plugin无法启动,本文就来介绍一下QT应用启动失败排查方法小结,具有一定的参考价值,感兴趣的可以了解以下
    2023-09-09
  • C++ auto类型说明符

    C++ auto类型说明符

    在C++11中引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型。当然,auto变量必须有初始值,这样编译器才能推断其类型
    2016-03-03
  • C语言 从根本上理解指针

    C语言 从根本上理解指针

    C语言这门课程在计算机的基础教学中一直占有比较重要的地位,然而要想突破C语言的学习,对指针的掌握是非常重要的,本文将具体针对指针的基础做详尽的介绍
    2022-04-04
  • C++ 类的构造函数详解及实例

    C++ 类的构造函数详解及实例

    这篇文章主要介绍了C++ 类的构造函数详解及实例的相关资料,学习C++ 的朋友对构造函数肯定不陌生,非常重要的基础知识,这里就详细介绍下,需要的朋友可以参考下
    2016-12-12
  • C++中浮点类型的具体使用

    C++中浮点类型的具体使用

    C++提供了不同精度的浮点类型,主要有 float、double 和 long double,这些浮点类型具有不同的字节大小和范围,用于满足不同应用场景的精度要求,本文主要介绍了C++中浮点类型的具体使用,感兴趣的可以了解一下
    2023-08-08
  • C语言如何建立动态链表问题

    C语言如何建立动态链表问题

    这篇文章主要介绍了C语言如何建立动态链表问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • C++ 十进制转换为二进制的实例代码

    C++ 十进制转换为二进制的实例代码

    这篇文章介绍了C++ 十进制转换为二进制的实例代码,有需要的朋友可以参考一下
    2013-10-10
  • QT连接SQLServer数据库的实现

    QT连接SQLServer数据库的实现

    要使用Qt连接SQL Server数据库,需要使用Qt提供的SQL模块和SQL Server驱动程序,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • C语言中常见的几种流程控制语句

    C语言中常见的几种流程控制语句

    这篇文章主要给大家介绍了关于C语言中常见的几种流程控制语句,分别包括goto语句、if语句、switch语句、while循环、do...while循环、for循环以及break和continue等,需要的朋友可以参考下
    2021-08-08

最新评论