C++循环链表解决约瑟夫问题

问题描述

设有n个人围坐在一个圆桌周围,现从第s个人开始报数,数到第m的人出列,然后从出列的下一个人重新开始报数,数到第m的人又出列,如此反复直到所有的人全部出列为止。Josephus问题是:对于任意给定的n、s、m,求出按出列次序得到的n个人员的序列。

代码

#include 
using namespace std;

typedef struct Node
{
    int data;
    struct Node *next;
}node;//定义一个结构体node

node* init(int n);
node* move(node* current,int m);
void Jusephus(int n,int s,int m,node *tail);

node *init(int n)//创建循环链表,要求用户输入值
{
    node *tail = NULL;
    node *p = NULL;
    node *s = NULL;
    int input = 0;
    tail = (node *)malloc(sizeof(node)); // 定义头结点
    if(tail == NULL)//如果申请的头结点失败
    {
        printf("Error: It is failed to get space!");
        exit(1);
    }

    tail->next = NULL;
    p = tail;
    printf("Enter the data\n");
    for(int i = 0;i < n;i++)
    {
        printf("Please input number: ");
        scanf("%d", &input);
        s = (node *)malloc(sizeof(node));
        if(s == NULL)
        {
            printf("Error: It is failed to get space!");
            exit(1);
        }
        s->data = input;
        p->next = s;
        p = p->next;
    }
    p->next = tail->next;
    return p;
}

void output(node *head,int n)//输出循环链表里的数值
{
    node *p = head->next;
    for (int i = 0; i < n;i++)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\r\n");
}

node *move(node *current,int m,int n){
    node *p = NULL;
    node *t = NULL;
    t = (node *)malloc(sizeof(node)); // 定义头结点
    p = current;
    for(int i = 0;i < m - 2;i++){
        p = p->next;
    }
    for (int i = 0; i < n; i++)
    {
        t = p->next;
    }
    return t;
}

void Josephus(int n,int s, int m,node *tail){ //约瑟夫函数
    int* A = new int[n];//用数组输出最终序列,将出列的数字输入这个数组当中
    int p;
    node *current = NULL;
    current = move(tail,s,n);//从第s个人开始
    output(current,n);//从第s个人开始的序列
    for (int i = 0; i < n; i++)//因为从第一个出列的人开始直到所有人都出列为止,所以循环n次
    {
        int x = n - i;//当前序列的人数
        current = move(current, m, x);//移动后的当前序列
        p = current->next->data;
        A[i] = p;
        current->next = current->next->next;
    }
    printf("当前序列为:");
    for(int i = 0;i 

个人感悟

大家试着画出循环的序列,把每一步都画出来,会变的清晰很多。这是我第一次上传自己所写的代码,可能不算简洁,各位大佬请海涵!

你可能感兴趣的:(数据结构,链表)