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. vue实现全选,反选

    1.example.vue <template> <table class="table-common"> <tr> <th class= ...

  2. thinkphp自带的验证码出现的问题

    thinkphp3.1.2版本中今天做验证码时出现了一个小问题. 在后台我引入过了一次验证也就是 import('ORG.Util.Image'); Image::buildImageVerify() ...

  3. 什么是JavaScript对象?

    对象是JavaScript的基本数据类型.对象是一种复合值:它将很多值(原始值或者其他对象)聚合在一起,可通过名字访问这些值.对象也可看做是属性的无序集合,每个属性都是一个名/值对.属性名是字符串,因 ...

  4. Java经典算法之插入排序(Insert Sort)

    插入排序在局部有序的情况下比冒泡排序快一倍,比选择排序快一点. 那什么是插入排序,就是将局部有序的数据向右移动,将未排序的数据插到他的前面 下面我们来解析代码: 这里外层循环out变量从1开始向右移动 ...

  5. linux 防火墙关闭

     systemctl status firewalld.servicesystemctl status iptables.service关闭防火墙,selinux15:54:43运维-李浩 2017/ ...

  6. Unity学习-鼠标的常用操作(八)

    本次主要介绍5个鼠标事件 void OnMouseEnter():鼠标进入 void OnMouseExit():鼠标移出 void OnMouseDown():鼠标点击 void OnMouseUp ...

  7. Python--10、进程知识补充

    守护进程 基于进程启动的子进程,会和主进程一起结束.主进程结束的依据是程序的代码执行完毕. #创建守护进程p=Process(task) p.daemon = True p.start() 子进程需要 ...

  8. python中struct.pack()函数和struct.unpack()函数

    python中的struct主要是用来处理C结构数据的,读入时先转换为Python的字符串类型,然后再转换为Python的结构化类型,比如元组(tuple)啥的~.一般输入的渠道来源于文件或者网络的二 ...

  9. js 学习笔记---基本概念

    早已接触javascript多年之后,竟然还有这些概念混淆不清,毫不知情,说出来真实无地自容 ! 1.使用严格模式,"use strict",虽然不适用,但是要知道,以免别人使用时 ...

  10. jenkins配置发送测试结果邮件

    简单版: https://www.cnblogs.com/gcgc/p/5631385.html https://blog.51cto.com/qicheng0211/1919341 升级版 http ...