用循环链表实现Josephus问题
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问题的更多相关文章
- 循环链表Josephus问题(c,cpp)
问题描述: 设有n个人围坐在一个圆桌周围,现从第s个人开始报数,数到第m个的人出列,然后从出列的下一个人重新开始报数,数到第m个的人又出列,.......,如此反复直到所有的人出列为止. Joseph ...
- Josephus环类问题,java实现
写出一个双向的循环链表,弄一个计数器,我定义的是到三的时候,自动删除当前节点,很简单. package Com; import java.util.Scanner; /* * 约瑟夫环问题,有n个人组 ...
- 约瑟夫(环)问题(Josephus problem)
问题描述:皇帝决定找出全国中最幸运的一个人,于是从全国选拔出 n 个很幸运的人,让这 n 个人围着圆桌进餐,可是怎么选择出其中最幸运的一个人呢?皇帝决定:从其中一个人从 1 开始报数,按顺序数到第 k ...
- 1009: josephus问题
1009: josephus问题 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 549 Solved: 227 Description josephus ...
- 华为面试题——约瑟夫问题的C++简单实现(循环链表)
/* author:jiangxin Blog:http://blog.csdn.net/jiangxinnju Function:method of Josephus que ...
- josephus问题
问题描述 n个人围成一圈,号码为1-n,从1开始报数,报到2的退出,剩下的继续从1开始报数,求最后一个人的号码. 算法分析 最直观的算法是用循环链表模拟.从首节点开始,不断删除第二个节点,直到只剩一个 ...
- Josephus
利用循环链表模拟约瑟夫问题,把自杀的人的顺序排列出来 代码如下: #include<stdio.h> #include<stdlib.h> typedef int status ...
- 约瑟夫问题(Josephus Problem)的两种快速递归算法
博文链接:http://haoyuanliu.github.io/2016/04/18/Josephus/ 对,我是来骗访问量的!O(∩_∩)O~~ 约瑟夫问题(Josephus Problem)也称 ...
- 习题3.10 约瑟夫环 josephus问题
/* assume a header */ /* 双向循环链表 */ struct Node; typedef struct Node * PtrToNode; typedef PtrToNode L ...
随机推荐
- linux 如何查看进程的执行时间
ps -ef|grep wo.php 得到 程序的pid 如 123 ps -p 123 -o etime
- ACM_变形课(并查集)
变形课 Time Limit: 2000/1000ms (Java/Others) Problem Description: 呃......变形课上Harry碰到了一点小麻烦,因为他并不像Hermio ...
- centos安装composer以及使用国内镜像
下载composer.phar文件 curl -sS https://getcomposer.org/installer | php 将composer.phar移动到环境变量中并且更名为compos ...
- [ POI 2011 ] Party
\(\\\) \(Description\) 给定一张 \(N\ (\ N\equiv 0\pmod{3}\ )\) 个节点,,\(M\)条边的图,并且保证该图存在一个大小至少为\(\frac{2}{ ...
- 1、Xamarin 环境准备
一.安装环境 1.安装VS2017 2.安装Xamarin扩展包 3.安装NDK 工具栏中,一个为AVD(模拟器管理)一个为NDK(管理Andoid SDK) 3.1 先打开NDK,在Tools\Op ...
- 1B课程笔记分享_StudyJams_2017
课程1B 概述 课程1B主要讲解了Android UI的ViewGroups(视图组).LinearLayout(线性布局).RelativeLayout(相对布局),Portrait Mode(竖屏 ...
- echarts通过ajax请求展示多叉树
背景:在sqlserver使用过程中经常由于各种原因会出现阻塞,并发数较高,很难肉眼看出那个session阻塞了其他process,通过sql查询出根源也需要大量的重复操作才能够找到. 因此就有这方面 ...
- Python语言之模块
模块基本上就是一个包含了所有你定义的函数和变量的文件.它用处在于使你你能在别的程序中重用它提供的功能和服务. 1.模块的使用方法 模块的文件名必须以.py作为扩展名. 当我们需要使用某个模块时,我们需 ...
- Centos 修改源
1首先备份原来的配置文件: mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2下载对应版本r ...
- shell脚本网络流量实时查看
Linux网络流量实时查看脚本,Centos默认没有自带流量查看工具,通过网上的资料做了一些修改 #!/bin/bash # Author: Ca0gu0 # Script Name: idev.sh ...