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. Complicated Expressions(表达式转换)

    http://poj.org/problem?id=1400 题意:给出一个表达式可能含有多余的括号,去掉多余的括号,输出它的最简形式. 思路:先将表达式转化成后缀式,因为后缀式不含括号,然后再转化成 ...

  2. [Swift通天遁地]二、表格表单-(7)电子邮件Mail:实现单元格左右滑动调出功能按钮

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  3. IOC框架---什么是IOC

    1 IoC理论的背景    我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑.                    ...

  4. JavaScript--什么是函数

    函数是完成某个特定功能的一组语句.如没有函数,完成任务可能需要五行.十行.甚至更多的代码.这时我们就可以把完成特定功能的代码块放到一个函数里,直接调用这个函数,就省重复输入大量代码的麻烦. 如何定义一 ...

  5. ACM_蛋糕小王子铁头娃

    Problem Description: 铁头娃制作了很多蛋糕,想分给他的小伙伴们,他的小伙伴很喜欢铁头娃做的蛋糕,每个人都想分到最多蛋糕 铁头娃想到了一个头铁主意:先给小伙伴们从1到N编号,在1-N ...

  6. 【转】Linux下使用locale命令设置语言环境

    转自:http://www.cnblogs.com/dolphi/p/3622570.html locale命令设置语言环境 在Linux中通过locale来设置程序运行的不同语言环境,locale由 ...

  7. 执行update, insert,delete 语句, 不返回结果集,(类型化参数)

    /// <summary> /// 执行update, insert,delete 语句, 不返回结果集,(类型化参数) /// </summary> /// <para ...

  8. 笔记《精通css》第4章 背景图像,平铺方式,背景定位,圆角框,投影,不透明

    第4章  背景图像,平铺方式,背景定位,圆角框,投影,不透明 1.背景图像 background-image:url() 2.平铺方式 background-repeat:repeat-x repea ...

  9. JS——筋斗云案例

    需求: 1.鼠标移动到哪里,云彩移动到哪里 2.鼠标离开,云彩回到原点 3.鼠标离开,云彩回到之前点击的地方 <!DOCTYPE html> <html lang="en& ...

  10. JS——属性绑定

    1.普通形式 <script> var stu = new Object(); stu.name = "ww"; console.log(stu);//{name: & ...