前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >约瑟夫环问题 C语言

约瑟夫环问题 C语言

作者头像
用户5513909
发布2023-04-25 11:06:17
7820
发布2023-04-25 11:06:17
举报

约瑟夫环问题,是一个经典的循环链表问题,题意是:已知 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("被干掉的人编号为:%d\n",p->id);
        free(p);
        p = tail->next;
    }
    printf("最后一个人编号为:%d\n",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;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-03-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档