循环链表,约瑟夫环问题

  约瑟夫(Josephus)环问题:编号为1,2,3,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一人开始重新从1报数,如此下去,直到所有人全部出列为止。

建立n个人的单循环链表存储结构,运行结束后,输出依次出队的人的序号。

#include <stdio.h>
#include <stdlib.h>
#include “malloc.h”

typedef struct Node{  //节点
    struct Node *next;
    int data;
}Node;

typedef struct List{  //循环链表存储结构
    Node *front;
    Node *rear;
    int length;
}List;

List* Init(){
    List* L = (List*)malloc(sizeof(List));
    L->front = NULL;
    L->rear = NULL;
    L->length = 0;
}

void insert(List *L, Node *e){
    if(L->length == 0){
        L->front = e;
        L->rear = e;
    }else{
        L->rear->next = e;
        L->rear = e;
    }
    L->rear->next = L->front;
    L->length++;
}

void display(List *L){
    Node *p = L->front;
    int i = 1;
    for( ; i <= L->length; i++){
        printf(“The out is %d\n”, p->data);
        p = p->next;
    }
}

int main()
{
    int N = 30; //人数
    int M = 3; //报数上限

    List *L = Init();
    int i = 1;
    for(; i <= N; i++){
        Node *e = (Node*)malloc(sizeof(Node));
        e->data = i;
        insert(L, e);
    }

    Node *p = L->rear;
    Node *q = NULL;
    int cnt = 1;
    int REST = L->length;
    while(REST > 0){
        for(cnt = 1; cnt < M; cnt++){
            p = p->next;
        }
        q = p->next;
        printf(“The out is %d\n”, q->data);
        p->next = p->next->next;
        REST–;
    }
    return 0;
}

    原文作者:code-maker
    原文地址: https://www.cnblogs.com/pbnull/p/4565169.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞