Josephus问题:设有n个人围坐在一个圆桌周围,现从第s个人开始报数,数到第m的人出列,然后从出列的下一个人重新开始报数,数到第m的人又出列。如此反复直到所有的人全部出列为止。

  思路:构建一个没有头结点的循环链表,实现自己的删除函数,数到第几个结点就把这个结点从链表中删除,然后重新数。

  难点在于写删除函数。

  代码如下:

 

#include <stdio.h>
#include <stdlib.h> typedef struct student * PNode; typedef struct student{
int data;
PNode next;
}Node; PNode create(int n)
{
PNode head=(PNode)malloc(sizeof(Node));
PNode p;
int data=;
p=head;
printf("请输入结点的值\n");
scanf("%d",&data);
p->data=data;
while(--n)
{
p->next=(PNode)malloc(sizeof(Node));
p=p->next;
printf("请继续输入结点的值\n");
scanf("%d",&data);
p->data=data;
}
p->next=head;
return head;
}
void print(PNode link)
{
PNode head,p;
if(link==NULL) return;
head=link;
p=link;
while(p->next!=head)
{
printf("%d ",p->data);
p=p->next;
}
printf("%d\n",p->data);
} PNode del(PNode link,int num)
{
PNode head=link;
PNode p=link;
PNode temp;
if(link==NULL)
{
// printf("链表为空");
return NULL;
}
// printf("要删除结点的值为%d\n",num);
//删除头结点
if(p->data==num)
{
if(p->next==head) //只剩下一个结点的情况
{
// printf("链表删除完毕。\n");
free(link);
return NULL;
}
while(p->next!=head)
p=p->next;
temp=p->next;
p->next=p->next->next;
head=p->next;
free(temp);
return head;
}
//删除非头结点
while(p->next->data!=num && p->next!=head)
{
p=p->next;
}
if(p->next==head)
{
// printf("没有找到这样的结点。\n");
return head;
}
temp=p->next;
p->next=p->next->next;
free(temp);
return head;
} void Josepus(PNode link,int n,int k,int m)
{
if(link==NULL)
{
printf("链表为空\n");
return;
}
printf("打印出列的顺序:");
PNode p=link;
int r=k+m-; //r为链表要移动的次数,根据图示来进行r大小的确认
while(r--)
{
p=p->next;
}
printf("%d ",p->data);
p=del(p,p->data);
while(p!=NULL)
{
r=m-;
while(r--)
{
p=p->next;
}
printf("%d ",p->data);
p=del(p,p->data);
}
printf("\n");
} int main(void)
{
int n,num;
int s,m;
printf("请输入要创建多少个结点\n");
scanf("%d",&n);
PNode link=create(n);
printf("打印初始链表\n");
print(link);
printf("请输入要从第几个人开始报数\n");
scanf("%d",&s);
printf("请输入要报多少个人\n");
scanf("%d",&m);
Josepus(link,n,s,m);/* 测试删除函数用地
while(1)
{
printf("请输入要删除的结点的值\n");
scanf("%d",&num);
link=del(link,num);
if(link==NULL)
break;
printf("打印删除后的链表\n");
print(link);
}
*/
return ;
}

程序猿必读

用循环链表实现Josephus问题的更多相关文章

  1. 循环链表Josephus问题(c,cpp)

    问题描述: 设有n个人围坐在一个圆桌周围,现从第s个人开始报数,数到第m个的人出列,然后从出列的下一个人重新开始报数,数到第m个的人又出列,.......,如此反复直到所有的人出列为止. Joseph ...

  2. Josephus环类问题,java实现

    写出一个双向的循环链表,弄一个计数器,我定义的是到三的时候,自动删除当前节点,很简单. package Com; import java.util.Scanner; /* * 约瑟夫环问题,有n个人组 ...

  3. 约瑟夫(环)问题(Josephus problem)

    问题描述:皇帝决定找出全国中最幸运的一个人,于是从全国选拔出 n 个很幸运的人,让这 n 个人围着圆桌进餐,可是怎么选择出其中最幸运的一个人呢?皇帝决定:从其中一个人从 1 开始报数,按顺序数到第 k ...

  4. 1009: josephus问题

    1009: josephus问题 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 549  Solved: 227 Description josephus ...

  5. 华为面试题——约瑟夫问题的C++简单实现(循环链表)

    /*     author:jiangxin     Blog:http://blog.csdn.net/jiangxinnju     Function:method of Josephus que ...

  6. josephus问题

    问题描述 n个人围成一圈,号码为1-n,从1开始报数,报到2的退出,剩下的继续从1开始报数,求最后一个人的号码. 算法分析 最直观的算法是用循环链表模拟.从首节点开始,不断删除第二个节点,直到只剩一个 ...

  7. Josephus

    利用循环链表模拟约瑟夫问题,把自杀的人的顺序排列出来 代码如下: #include<stdio.h> #include<stdlib.h> typedef int status ...

  8. 约瑟夫问题(Josephus Problem)的两种快速递归算法

    博文链接:http://haoyuanliu.github.io/2016/04/18/Josephus/ 对,我是来骗访问量的!O(∩_∩)O~~ 约瑟夫问题(Josephus Problem)也称 ...

  9. 习题3.10 约瑟夫环 josephus问题

    /* assume a header */ /* 双向循环链表 */ struct Node; typedef struct Node * PtrToNode; typedef PtrToNode L ...

随机推荐

  1. spring基础学习---简单配置文件

  2. window.onload的使用

    window.onload:当页面加载的时候可以调用某些函数 例如: 1.最简单的调用方式 直接写到html的body标签里面,如: <html> <body onload=&quo ...

  3. dialog的各类显示方法

    图1效果:该效果是当按返回按钮时弹出一个提示,来确保无误操作,采用常见的对话框样式. 代码: 创建对话框方法dialog() protected void dialog() {  AlertDialo ...

  4. NPOI复制模板导出Excel

    本人菜鸟实习生一枚,公司给我安排了一个excel导出功能.要求如下:1.导出excel文件有样式要求:2.导出excel包含一个或多个工作表:3.功能做活(我的理解就是excel样式以后可能会变方便维 ...

  5. JDBC链接数据库步骤

    java中定义链接数据库的标准:JDBC 1.导包:不同数据库有不同的jdbc驱动包,而且jdbc驱动包和数据库版本必须对应 2.测试 3.写代码 try { 1.//加载JDBC驱动    Clas ...

  6. Redis主从复制失败(master_link_status:down)

    今天配置redis主从复制时出现master_link_status:down提示. 首先打开slave的redis.conf配置文件,确定slaveof 和masterauth 两个选项配置是否正确 ...

  7. JS——html基本结构

    document.title——文档标题 document.head——文档头标签 document.body——文档的主体 document.documentElement 表示整个文档的html标 ...

  8. Java_Web三大框架之Hibernate 入门(一)

    一.Hibernate简介: Hibernate作者——Gavin King Hibernate创始人 < Hibernate in action >作者 EJB 3.0的Entity b ...

  9. Python 之12306网站验证码校验案例

    import requests from PIL import Image import jsons requests.packages.urllib3.disable_warnings() head ...

  10. windows上关闭Nagle算法

    下面的设置可以调整或禁用 nagel 算法.禁用 nagel 算法以后, 允许很小的包没有延迟立即发送.建议对某些游戏关闭 nagel 算法, 这样做对文件传输/吞吐量有负面影响.默认状态( 开启na ...