问题:设有n个人围成一个圆圈,现从第s个人开始报数,数到第m的人出列,然后从出列的下一个人重新开始报数,数到第m的人再次出列,如此反复,直到所有的人全部出列为止。对于任意给定的n、s、m,求按出列次序得到的n个人员的序列。

例:

图片就是问题简单示例,里面是每次要循环的数据,后面的S是出列的人

思路:

  1. 先创建一个链表,链表的长度就是n
  2. 从第s个节点开始循环
  3. 判断是否是第m个数
  4. 如果是第m个数,就输出并删除当前节点
  5. 循环到最后一个节点,再从第一个节点接着循环

主要代码:

 void yuesefu (LinkList * head, int n, int s, int m)
{
LinkList * p, * r, * q;
int i = , j = n, k, l;
p = GetData_LinkList(head, s); //从第S位开始 //判断是否循环完成
while (j > ) {
//判断是否为第m个数
if (i == m) {
i = ;
//输出这轮出局的人
printf("%d\n", p->data);
//存储当前节点的值
k = p->data; //删除当前节点
q = head->next;
l=;
while (q != NULL) {
//判断当前节点得值是否等于要删除的值
if (q->data == k) {
//删除节点
DeleteNode_LinkList(head, l);
break;
}
l++;
q = q->next;
}
//从下一个节点开始循环
p = GetData_LinkList(head, l);
j--;
}else {
p = p->next;
}
//如果超出链表长度,再从第一个节点开始循环
if (p == NULL)
p = head->next; i++;
} }

整体代码:

 #include <stdio.h>
#include <stdlib.h> typedef int elemtype; typedef struct node
{
elemtype data;
struct node * next;
}LinkList; //创建链表
LinkList * Create_LinkListF(int n)
{
int i;
LinkList * head, * p;
head = (LinkList *) malloc (sizeof(LinkList)); if (head == NULL)
return head; head->next = NULL; for (i=; i<=n; i++) {
p = (LinkList *) malloc (sizeof(LinkList)); if (p == NULL)
return head; p->data = i;
p->next = head->next;
head->next = p;
} return head;
} //按序号查找
LinkList * GetData_LinkList (LinkList * head, int i)
{
LinkList * p;
int j = ; if (i <= )
return NULL; p = head; while (p->next != NULL && j<i) {
p = p->next;
j++;
} if (i == j)
return p;
else
return NULL;
} //删除节点
int DeleteNode_LinkList (LinkList * head, int i)
{
LinkList * p, * r; if (i <= )
p = NULL;
else
if (i == )
p = head;
else
p = GetData_LinkList(head, i-); if (p == NULL) {
return ;
}else {
r = p->next;
if (r == NULL)
return ; p->next = r->next;
free(r);
return ;
} } void yuesefu (LinkList * head, int n, int s, int m)
{
LinkList * p, * r, * q;
int i = , j = n, k, l;
p = GetData_LinkList(head, s); //从第S位开始 //判断是否循环完成
while (j > ) {
//判断是否为第m个数
if (i == m) {
i = ;
//输出这轮出局的人
printf("%d\n", p->data);
//存储当前节点的值
k = p->data; //删除当前节点
q = head->next;
l=;
while (q != NULL) {
//判断当前节点得值是否等于要删除的值
if (q->data == k) {
//删除节点
DeleteNode_LinkList(head, l);
break;
}
l++;
q = q->next;
}
//从下一个节点开始循环
p = GetData_LinkList(head, l);
j--;
}else {
p = p->next;
}
//如果超出链表长度,再从第一个节点开始循环
if (p == NULL)
p = head->next; i++;
} } int main (void)
{
int n, s, m;
LinkList * head; printf("n=");
scanf("%d", &n); printf("s=");
scanf("%d", &s); printf("m=");
scanf("%d", &m); head = Create_LinkListF(n);
yuesefu(head, n, s, m);
}

用C链表实现约瑟夫环问题的更多相关文章

  1. 单向环形链表解决约瑟夫环(Josephus)问题

    一.约瑟夫环问题 Josephu 问题为:设编号为1,2,- n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那 ...

  2. C语言链表实现约瑟夫环问题

    需求表达:略 分析: 实现: #include<stdio.h> #include<stdlib.h> typedef struct node { int payload ; ...

  3. 通过例子进阶学习C++(六)你真的能写出约瑟夫环么

    本文是通过例子学习C++的第六篇,通过这个例子可以快速入门c++相关的语法. 1.问题描述 n 个人围坐在一个圆桌周围,现在从第 s 个人开始报数,数到第 m 个人,让他出局:然后从出局的下一个人重新 ...

  4. 简单约瑟夫环的循环单链表实现(C++)

    刚刚接触C++以及数据结构,今天做了第一次尝试用C++和数据结构解决问题,问题是基于约瑟夫环问题的简单版. 先来看看约瑟夫环问题的介绍: 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3.. ...

  5. 约瑟夫环问题 --链表 C语言

    总共有m个人在圆桌上,依次报名,数到第n个数的人退出圆桌,下一个由退出人下一个开始继续报名,循环直到最后一个停止将编号输出 #include <stdio.h>#include <s ...

  6. 约瑟夫环(Joseph)的高级版(面向事件及“伪链表””)

    约瑟夫环问题: 在一间房间总共有n个人(下标0-n-1),只能有最后一个人活命. 按照如下规则去杀人: 所有人围成一圈 顺时针报数,每次报到q的人将被杀掉 被杀掉的人将从房间内被移走 然后从被杀掉的下 ...

  7. 约瑟夫环问题的链表解法和数学解法(PHP)

    约瑟夫环问题 一群猴子排成一圈.按1,2,-,n依次编号.然后从第1仅仅開始数,数到第m仅仅,把它踢出圈.从它后面再開始数,再数到第m仅仅.在把它踢出去-.如此不停的进行下去.直到最后仅仅剩下一仅仅猴 ...

  8. Java数据结构之单向环形链表(解决Josephu约瑟夫环问题)

    1.Josephu(约瑟夫.约瑟夫环)问题: 设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m ...

  9. 3,java数据结构和算法:约瑟夫环出队顺序, 单向环形链表的应用

    什么是约瑟夫环? 就是数小孩游戏: 直接上代码: 要实现这个,只需要理清思路就好了 孩子节点: class Boy{ int no;//当前孩子的编码 Boy next; // 下一节点 public ...

随机推荐

  1. codeforces 424D Biathlon Track

    codeforces 424D Biathlon Track 题意 题解 代码 #include<bits/stdc++.h> using namespace std; #define f ...

  2. [T-ARA][yayaya]

    歌词来源:http://music.163.com/#/song?id=22704449 U look at me Right T-ARA U Ready Let me seeya LaLaLaLa ...

  3. Java虚拟机17:互斥同步、锁优化及synchronized和volatile

    互斥同步 互斥同步(Mutual Exclusion & Synchronization)是常见的一种并发正确性保证手段.同步是指子啊多个线程并发访问共享数据时,保证共享数据在同一时刻只能被一 ...

  4. VMware三个版本号workstation、server、esxi的差别

    VMware三个版本号 workstation: 单机级.用在个人桌面系统中.须要操作系统支持 servier:工作组级,用于服务器.须要操作系统支持 esxi:企业级,用于服务器,不须要操作系统支持 ...

  5. 2251. [2010Beijing Wc]外星联络【后缀数组】

    Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻 找外星人的事业.于是,他每天晚上都爬在屋顶上试图用自己的收音机收听外星 人发来的信 ...

  6. 对cordova打包的apk文件进行签名

    可用于没有签名和已经签名的apk,再次签名. jarsigner -verbose -keystore [keystorePath] -signedjar [apkOut] [apkin] [alia ...

  7. [教程] 【【【【odex教程之jar】】】】/system/framework里面的jar做odex g13

    dexopt-wrapper core.jar core.odex dexopt-wrapper ext.jar ext.odex dexopt-wrapper framework.jar frame ...

  8. 开源 免费 java CMS - FreeCMS1.9 全文检索

    项目地址:http://code.google.com/p/freecms/ 全文检索 从FreeCMS 1.7開始支持 仅仅有创建过索引的对象才干被lucene类标签查询到. 信息类数据会在信息更新 ...

  9. oracle 事务 数据伪列

    在用户进行数据更新操作(DML)事务一定会起作用. 事务的出现会保证数据的完整性.一致性.在整个事务的处理过程之中主要使用两个操作命令: · 事务的提交(COMMIT):是真正的向数据库之中发出更新指 ...

  10. 【PHP开发规范】老生常谈的编码开发规范你懂多少?

    [PHP开发规范]老生常谈的编码开发规范你懂多少? 这几天看了一下阿里技术发布的一套Java开发规范<阿里巴巴Java开发手册>,里面写了阿里内部的Java开发规范标准,写的很好.这套Ja ...