实验作业一:线性表(链表)

1. 用单循环链表解决约瑟夫问题。

问题描述:

一个旅行社要从n个旅客中选出一名旅客,为他提供免费的环球旅行服务。旅行社安排这些旅客围成一个圆圈,从帽子中取出一张纸条,用上面写的正整数m(<n)作为报数值。游戏进行时,从第s个人开始按顺时针方向自1开始顺序报数,报到m时停止报数,报m的人被淘汰出列,然后从他顺时针方向上的下一个人开始重新报数,如此下去,直到圆圈中只剩下一个人,这个最后的幸存者就是游戏的胜利者,将得到免费旅行的奖励。其中数据结构采用单循环链表。

解决方案要求:

输入参数:n、m、s

输出参数:n个人的淘汰序列

参考样例:

代码:

 1 #include "stdlib.h"
 2 #include "stdio.h"
 3 #include <iostream>
 4 using namespace std;
 5
 6 typedef int datatype;
 7
 8 typedef struct node {
 9     datatype data;
10     struct node *next;
11 }node, *LinkList;
12
13 void Inite(LinkList &first, int n)    {
14     first = (node*)malloc(sizeof(node)); //注意此处,不可以直接分配长度为n*sizeof(node)的空间,因为这里只可以给头节点分配,如果分配多了也没用
15     node *p = first, *q;
16     //first->data = 1;
17     //cout << first->data;
18     for(int i = 0; i < n - 1; i++)    {
19         p->data = i + 1;
20         q = (node*)malloc(sizeof(node));
21         //cout << "Number " << i+1 << " p->data  " << p->data << endl;
22         p -> next = q;
23         p = q;
24     }
25     p -> data = n;
26     p -> next = first;
27     //cout << "Number " << n << " p->data  " << p->data << endl;
28 }
29
30 void Josephus(LinkList &first, int m, int s)    {
31     cout << "******** Solve Josephus Problem ********" << endl;
32
33     node *nowPoint = first, *prePoint = first;
34     if (s > 1)    {
35         for (int i = 0; i < s - 1; i++)    {
36             prePoint = nowPoint;
37             nowPoint = nowPoint -> next;
38             //cout << "NUMBER " << i + 1 << " prePoint " << prePoint->data << endl;
39             //cout << "NUMBER " << i + 1 << " nowPoint " << nowPoint->data << endl;
40         }
41     }
42     else if(s == 1)    {
43         while(prePoint -> next != nowPoint)
44             prePoint = prePoint -> next;
45     }
46     else    {
47         printf("PLEASE ENTER AN S WHICH BIGGER THAN 4 !");
48     }
49     while (nowPoint -> next != nowPoint)    {
50         for (int i = 0; i < m - 1; i++)    {
51             prePoint = nowPoint;
52             nowPoint = nowPoint -> next;
53             //cout << "NUMBER " << i + 1 << " prePoint " << prePoint->data << endl;
54             //cout << "NUMBER " << i + 1 << " nowPoint " << nowPoint->data << endl;
55         }
56             prePoint -> next = nowPoint -> next;
57             cout << "Number      " << nowPoint -> data << " is out" << endl;
58             free(nowPoint);
59             nowPoint = prePoint -> next;
60     }
61     cout << "Number      " << nowPoint -> data << " is out" << endl;
62     cout << "****************** END *****************" << endl;
63 }
64
65 int main()    {
66     int n, m, s;
67     LinkList first;
68
69     cout << "Enter n:" << endl;
70     cin >> n;
71     cout << "Enter m:" << endl;
72     cin >> m;
73     cout << "Enter s:" << endl;
74     cin >> s;
75
76     Inite(first, n);
77     Josephus(first, m, s);
78
79     return 0;
80 }

转载于:https://www.cnblogs.com/QingHuan/p/4947244.html

【数据结构作业—01】用单循环链表解决约瑟夫问题相关推荐

  1. 【Java】单循环链表解决约瑟夫环问题

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

  2. java模拟单链表环形链表解决约瑟夫问题

    java模拟环形链表解决约瑟夫问题 此文是观看尚硅谷韩老师的数据结构与算法学习视频整理的笔记 约瑟夫问题描述 约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题.在计算机编程的算 ...

  3. (数据结构与算法)单向环形链表解决约瑟夫问题

    约瑟夫(Josephu)问题 Josephu问题为: 设编号为1, 2,- n的n个人围坐一圈,约定编号为k (1<=k<=n) 的人从1开始报数,数到m的那个人出列,它的下一位又从1开始 ...

  4. java实现环形链表解决约瑟夫环问题

    什么是环形链表? 环形链表就是单向链表的基础上让链表的首尾相连,形成一个环,这就是一个循环链表. 什么是约瑟夫环问题? 约瑟夫环如下: 约瑟夫问题是个著名的问题:N个人围成一圈,第一个人从1开始报数, ...

  5. Java中使用链表解决约瑟夫问题(丢手绢问题)

    文章目录 文章目录 前言 一.思路分析 二.代码实现 1.Chird类建立 2.链表创建 3.功能实现 总结 其他解决方式: Java中使用list解决约瑟夫问题https://blog.csdn.n ...

  6. 用单循环链表实现约瑟夫环(c语言)

    首先我是设置的链表节点的元素包括三个:1.每个人的各自拥有的顺序(math表示)2.每个人所拥有的密码(data表示)3.指针元素指向下一个: typedef struct node {int mat ...

  7. 数据结构—带头结点的单循环链表

    1.基本操作 循环链表的特点是最后一个元素的指针域指向头结点. 因此对于循环链表的初始化(设表的头结点是L, 不再是L->next=NULL,而是L->next=L.循环链表为空时,头结点 ...

  8. 《数据结构基础知识②》--单循环链表+双向链表+时间效率+比较

    目录 一.单循环链表 1.概念 2.循环条件 3.尾指针表示循环链表 4.带尾指针的链表合并 二.双向链表 1.概念 2.双向循环链表 3.双向链表结构的对称性 4.双向链表的插入 5.双向链表的删除 ...

  9. 活用内核链表解决约瑟夫斯问题

    约瑟夫斯问题(有时也称为约瑟夫斯置换),是一个出现在计算机科学和数学中的问题.在计算机编程的算法中,类似问题又称为"约瑟夫环",也有的地方叫做"丢手绢". 问题 ...

最新文章

  1. 面向对象进阶2 组合
  2. 函数对象,名称空间与作用域,闭包,装饰器
  3. verilog中的三目运算符
  4. Java布尔类的compareTo()
  5. 中国IT行业盛行,互联网行业早已饱和!程序员“过多”是主要原因?
  6. es xxx_by_query
  7. bzoj2257瓶子与燃料——最大公约数
  8. C/C++ 活动预处理器
  9. usb万能驱动win7_我!Win7!还能接着续!Z490 B460 H410 Win7 保姆教程
  10. Yii2汉字转拼音类
  11. 河南巴旦木生态农业:巴旦木与杏仁有哪些不同,如何分辨巴旦木仁与杏仁?
  12. 诸葛io的技术架构图_诸葛io
  13. python获取文字坐标_python坐标获取
  14. 进入职场瓶颈期?3步摆脱“毛毛虫效应”,不做悲剧的“跟随者”
  15. java实现PDF 转WORD
  16. linux安装git并配置GitHub账号,本地与GitHub之间进行文件的上传(push)、下载(克隆)、更新
  17. 淘宝商品评价api接口(app、h5端),淘宝评论视频API接口,淘宝评论API接口
  18. 准确进行网速测试的方法(适用于电信,联通等多种网络)
  19. 建筑施工技术【13】
  20. 多模态学习、迁移学习、元学习、联邦学习、表示学习、知识图谱、无监督学习、半监督学习、弱监督学习、自监督学习简介

热门文章

  1. 朱峰谈概念设计(二):我们设计什么
  2. 简单的文本设计就能影响游戏体验?游戏中提升玩家体验的小设计
  3. 游戏与算法的必经之路
  4. VS code 使用 Remote-SSH 进行python远程开发
  5. Oracle Spatial-元数据及SDO_GEOMETRY
  6. oracle中minus
  7. SaaS全球普及面临三大门槛
  8. SPOJ SUMPRO(数学)
  9. [na]tcpdump参数应用参考
  10. 写个Fragment方便的抽象基类 BaseFragment