约瑟夫环--C语言 分手后的思念是犯贱 2022-04-02 08:21 151阅读 0赞 约瑟夫(Joseph)问题的一种描述是:编号为1,2,3,…,n的n个人按顺时针方向围坐一圈。每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数,令其出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新报数,如此下去,直到所有人全部出列为止。 试设计一个程序求出出列顺序。 测试数据:m的初值为20;n=7,7个人的密码依次为:3,1,7,2,4,8,4(对应于节点的密码),首先m值为20,则正确的出列顺序应为6,1,4,7,2,3,5(对应于节点的编号) 在设计程序时要特别注意第一个插入的节点和最后一个删除的节点的处理;还有就是密码为1的节点出列后的下一个节点的处理(因为密码为1的节点出列后下一个出列的节点即为该节点出列之前的下一个节点)。 代码: #include <stdio.h> #include <stdlib.h> typedef struct JoseCycleNode { int pwd;//密码 int num;//节点编号 struct JoseCycleNode *next;//指向链表下一个节点的指针 }JoseCycleNode;//链表结构体 //创建约瑟夫环 JoseCycleNode *createLinkList(int num) { int i = 0; JoseCycleNode *p = NULL; JoseCycleNode *last = NULL;//指向链表中最后插入的节点的指针 while(i < num) { p = (JoseCycleNode *)malloc(sizeof(JoseCycleNode)); printf("Please input %ds node's password!\n",i + 1); scanf("%d",&p->pwd); p->num = i + 1; if(0 == i) { p->next = p;//i = 0代表是第一个插入的节点,循环链表的第一个节点的next指针指向节点本身 } else { p->next = last->next; last->next = p; } last = p; i ++; } last = last->next;//将指针指向第一个插入的节点 return last; } //按照删除节点的顺序输出节点编号 void putNum(JoseCycleNode *List,int pwd) { int i = 0; JoseCycleNode *p = List; while(List->next != List) { for(i = 1;i < pwd - 1;i++) { p = p->next; } List = p; p = p->next; pwd = p->pwd; List->next = p->next; printf("%d ",p->num); free(p); if(pwd == 1) { p = List;//当密码为1时,只需要删除List节点的下一个节点即可 } else { p = List->next;//因为计数是从被删除节点的下一个节点开始 } } printf("%d\n",p->num);//输出最后一个节点的节点编号 free(p);//删除最后一个节点 } int main() { JoseCycleNode *List = NULL; int num = 0;//链表节点个数 int pwd = 0; printf("Please input node number:"); scanf("%d",&num); List = createLinkList(num); printf("Please input first limit cycle num!\n"); scanf("%d",&pwd); putNum(List,pwd); return 0; } 这个是当时上大学时没有实现的代码,好像当时没有处理好只有一个节点的情况。今天突然想到了就写了一下,用的时间不算很少,但也还好~坚持下去吧~自己会越来越强大的!
相关 约瑟夫环 约瑟夫环 1、参考资料 https://blog.csdn.net/shuaicihai/article/details/54847433 2、使用数组 痛定思痛。/ 2022年11月27日 06:54/ 0 赞/ 150 阅读
相关 约瑟夫环 package com.someusefuldesign.demo; import java.util.ArrayList; /约瑟 桃扇骨/ 2022年08月13日 15:54/ 0 赞/ 144 阅读
相关 约瑟夫环 \include<stdio.h> \include<stdlib.h> /\ 约瑟夫环是一个数学的应用问题: 已知n个人(以编号1,2,3...n分别表示)围 ╰半夏微凉°/ 2022年08月07日 01:53/ 0 赞/ 166 阅读
相关 约瑟夫环 约瑟夫环 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个 怼烎@/ 2022年07月15日 13:39/ 0 赞/ 163 阅读
相关 约瑟夫环 N个人坐成一个圆环(编号为1 - N),从第1个人开始报数,数到K的人出列,后面的人重新从1开始报数。问最后剩下的人的编号。 例如:N = 3,K = 2。2号先出列,然后是 桃扇骨/ 2022年06月11日 06:26/ 0 赞/ 162 阅读
相关 约瑟夫环 【问题描述】 编号为 1,2,...,n 的 n 个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。现在给定一个随 机数 m>0,从编号为 1 的人开始,按顺时针方向 1 今天药忘吃喽~/ 2022年04月22日 06:06/ 0 赞/ 204 阅读
相关 约瑟夫环--C语言 约瑟夫(Joseph)问题的一种描述是:编号为1,2,3,…,n的n个人按顺时针方向围坐一圈。每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开 分手后的思念是犯贱/ 2022年04月02日 08:21/ 0 赞/ 152 阅读
相关 约瑟夫环 > 约瑟夫环运作如下: > 1、一群人围在一起坐成 \[2\] 环状(如:N) > 2、从某个编号开始报数(如:K) > 3、数到某个数(如:M)的时候,此人出列, 阳光穿透心脏的1/2处/ 2022年03月22日 16:38/ 0 赞/ 259 阅读
相关 约瑟夫环 编号为1,2,…,n的n个人按顺时针方向围坐在一张圆桌周围,每人持有一个密码(正整数)。一 开始任选一个正整数m作为报数上限值,从第一个人开始按顺时针方向自1开始报数,报到m时 r囧r小猫/ 2021年12月20日 04:29/ 0 赞/ 283 阅读
相关 约瑟夫环 int cir(int n,int m) { int p=0; for(int i=2;i<=n;i++) { 我会带着你远行/ 2021年12月16日 15:13/ 0 赞/ 290 阅读
还没有评论,来说两句吧...