C++实现约瑟夫环问题与MSISDN校验

需积分: 10 19 下载量 182 浏览量 更新于2024-07-30 1 收藏 282KB DOC 举报
"华为2011年机试题及C++解决方案,涉及数据结构与算法,具体是约瑟夫环问题的实现。" 在给定的题目中,主要考察的是数据结构和算法的应用,特别是链表操作和循环链表的构建。题目描述的是约瑟夫环(Josephus Problem)问题,这是一个著名的理论问题,通常用递归或链表来解决。在这个版本的题目中,要求使用循环链表来模拟此问题。 首先,我们需要创建一个循环链表,这可以通过定义一个`LinkList`结构体来完成,结构体包含一个整型变量`num`存储节点的值以及一个指向下一个节点的指针`next`。`creat`函数用于构建这个循环链表,它接受一个整数`n`作为参数,表示链表的长度,然后依次插入`n`个节点,最后将链表尾部的指针链接回链表头部,形成循环。 接着,`fun`函数是解决问题的核心,它接受一个循环链表的头指针`L`和一个整数`m`,表示报数的间隔。函数通过遍历链表并删除每`m`个节点,直到链表为空,输出的顺序即为出列顺序。在每次迭代中,我们都会移动指针`p`,并在`m-1`次迭代后删除当前节点`p`,然后更新链表结构。 在`main`函数中,我们创建了一个长度为9的链表,并设置了报数间隔`m`为5,调用`fun`函数进行模拟并打印结果。 此外,还提供了一个`verifyMsisdn`函数的代码片段,但该函数并未完成,且与约瑟夫环问题无关。它可能用于验证电话号码的格式,检查输入的电话号码字符串是否满足特定条件,如长度为13且以数字'8'开头。 总结起来,这个题目主要涉及到以下知识点: 1. 结构体定义和指针操作:创建链表结构体`LinkList`,并使用指针进行链表操作。 2. 循环链表的构建:通过`creat`函数构建一个循环链表,使链表尾部指针指向头部。 3. 链表遍历和删除:在`fun`函数中,通过遍历链表并删除每`m`个节点来模拟约瑟夫环问题。 4. 算法设计:理解并实现约瑟夫环问题的算法,涉及循环和计数。 5. 输入输出处理:在`main`函数中设置测试数据,并调用相关函数处理输出。 这些知识点对于理解和解决实际的编程问题,特别是在面试和机试中,是非常重要的。通过解决这样的问题,可以提高对数据结构、链表操作以及算法设计的理解和应用能力。