约瑟夫环问题 C语言

2023-04-25 11:06:17 浏览数 (1)

约瑟夫环问题,是一个经典的循环链表问题,题意是:已知 n 个人(分别用编号 1,2,3,…,n 表示)围坐在一张圆桌周围,从编号为 m的人开始顺时针报数,数到 n 的那个人被干掉;他的下一个人又从 1 开始,还是顺时针开始报数,数到 n 的那个人又被干掉;依次重复下去,直到圆桌上剩余一个人。

代码语言:javascript复制
//
// Created by fish on 2020/3/21.
//
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
    int id;
    struct node *next;
}person; //创建节点
//建立循环链表
person *create_list(int cnt){
    person * head=(person*)malloc(sizeof(person));
    person * cycle_list = head;
    head->id = 1;
    head->next = NULL;
    for(int i=2;i<=cnt;i  ){
        person * data=(person*)malloc(sizeof(person));
        data->id = i;
        data->next = NULL;
        cycle_list->next = data;
        cycle_list = cycle_list->next;
    }
    cycle_list->next = head;
    return head;
};
//从第m个人开始报数1,报数到n的为目标
void find_person(person *head,int m,int n){
    person *tail = head;
    while(tail->next!=head){
        tail = tail->next;
    }
    person *p = head;
    while(p->id!=m){
        tail = p;
        p = p->next;
    }
    while(p->next!=p){
        for(int i=1;i<n;i  ){
            tail = p;
            p = p->next;
        }
        tail->next = p->next;
        printf("被干掉的人编号为:%dn",p->id);
        free(p);
        p = tail->next;
    }
    printf("最后一个人编号为:%dn",p->id);
    free(p);
}

int main() {
    printf("输入圆桌上的人数cnt:");
    int cnt;
    scanf("%d",&cnt);
    person * head=create_list(cnt);
    printf("从第m人开始报数(m>1且m<%d):",cnt);
    int m;
    scanf("%d",&m);
    printf("数到n的人被干掉:");
    int n;
    scanf("%d",&n);
    find_person(head, m, n);
    return 0;
}

0 人点赞