循环链表,约瑟夫环问题

约瑟夫(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;
}

时间: 2024-10-11 12:16:31

循环链表,约瑟夫环问题的相关文章

约瑟夫环----循环链表问题

我们构造一个循环链表来表示排成圆圈的人.每个人的链接指向圆圈内在他左边的人.正数i表示圆圈内的第i个人.已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围的人全部出列.通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解. 一道算法面试题如下: 约瑟夫环问题:一圈共有N个人,开始报数,报到M的人自杀,然后重新开始报数,问最后自杀的人是谁? 如

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

约瑟夫环问题 已知 n 个人(n>=1)围坐一圆桌周围,从 1 开始顺序编号,从序号为 1 的人开始报数,顺时针数到 m 的那个人出列.下一个人又从 1 开始报数,数到m 的那个人又出列.依此规则重复下去,直到所有人全部出列.请问最后一个出列的人的初始编号. 要求 输入人数 n,所报数 m,输出最后一个人的初始编号. 解决思路 首先因为是圆桌问题,使用链表解决的话需要构建循环链表. 接着是出列问题,这里我的设计思路是将指向链表的指针移动到需要出列的人的位置,然后根据正常的链表删除进行操作即可.

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

约瑟夫环问题可以简单的使用数组的方式实现,但是现在我使用循环链表的方法来实现,因为上午看到一道面试题规定使用循环链表解决约瑟夫环问题. 什么是约瑟夫环? “约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围的人全部出列.”(百度百科中的解决办法列出了很多,可以看到循环链表并不是最简单的方法) 这道面试题考察了循环链表的“创建”,

javascript中使用循环链表实现约瑟夫环问题

1.问题 2.代码实现 /** * 使用循环链表实现解决约瑟夫环问题 * */ //链表节点 function Node(element){ this.element = element; this.next = null; } //定义链表类 function LList(){ this.head = new Node("head"); this.head.next = this.head; this.find = find; this.insert = insert; this.f

(java描述)关于链表的代码-----单双、循环链表、约瑟夫环、多项式相加

将链表头尾倒置 将几个链表合并成一个新的链表,将链表中重复的节点去掉,并按大小排序 双向循环链表 单向循环链表(约瑟夫循环) 多项式相加 程序源代码 单链表.单向循环链表结点类 package javab; public class Node { int data; Node next; public Node(int data){ this.data=data; } } 第一题代码: package javab; import java.util.Scanner; public class I

单向循环链表(约瑟夫环)

#include<stdio.h> #include<stdlib.h> #define N 10 typedef struct node{ int  data; struct node * next; }ElemSN; ElemSN*Createlink(int a[],int n){ int i; ElemSN*h=NULL,*p,*t; for(i=0;i<N;i++){ p=(ElemSN*)malloc(sizeof(ElemSN)); p->data=a[i

用循环链表解决约瑟夫环的问题

约瑟夫环问题简介 约瑟夫环问题的原来描述为,设有编号为1,2,--,n的n(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,--,如此下去,直到所有人全部出圈为止.当任意给定n和m后,设计算法求n个人出圈的次序.  稍微简化一下. 问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数.求胜利者的编号. 解题思路 将每个人的编号作为结点值,因为报数是循环着来的,故可

约瑟夫环(循环链表)

约瑟夫环问题,是一个经典的循环链表问题,题意是:已知 n 个人(分别用编号 1,2,3,…,n 表示)围坐在一张圆桌周围,从编号为 k 的人开始顺时针报数,数到 m 的那个人出列:他的下一个人又从 1 开始,还是顺时针开始报数,数到 m 的那个人又出列:依次重复下去,直到圆桌上剩余一个人. #include <iostream> using namespace std; struct person { int number; person *next; }; person* initLink(

用单向循环链表实现约瑟夫环问题

约瑟夫环的问题和种类有很多,这是一道基本的约瑟夫环问题,通过单向循环链表实现模拟此过程. 代码如下: #include<stdio.h> #include<stdlib.h> typedef struct Node { int num; int password; struct Node *next; }CircleNode,*CircleList; CircleList Create(int n); void Knockout(CircleList L,int n,int m);

用循环链表解决约瑟夫环问题

约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围的人全部出列. 下面我们用循环列表模拟这个过程: 1 //节点定义与单链表相同,在此省略 2 //use cyclical linked list to solve josephus problem 3 template <typename Type> class Linked