zoukankan      html  css  js  c++  java
  • 【数据结构作业—01】用单循环链表解决约瑟夫问题

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

    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 }
  • 相关阅读:
    python深度学习之灾难求生预测(titanic)
    python深度学习之语音识别(speech recognize)
    greenplum集群状态恢复与同步
    python手写图片识别MNIST
    python随机森林房价预测
    机器学习常用模型
    python爬虫优化和错误日志分析
    数据挖掘数学基础
    虚拟机spark集群搭建
    虚拟机zookeeper和hbase集群搭建
  • 原文地址:https://www.cnblogs.com/QingHuan/p/4947244.html
Copyright © 2011-2022 走看看