约瑟夫环问题
来源:互联网 发布:js水平时间轴 编辑:程序博客网 时间:2024/06/17 02:04
/*面试例题:已知n个人(以编号1,2,3,...n分别表示)围坐在一张圆桌周围,从编号为k的人开始报数,数到m的那个人出列, 他的下一个人又从K开始报数,数到m的那个人出列;依此规律重复下去,知道圆桌周围的人全部出列。解析:约瑟夫环的问题----要通过输入n,m,k 3个正整数,求出列的序列,采用的是典型的循环链表的数据结构,就是将一个链表的尾元素指针指向队首元素。核心步骤: 1.建立一个具有n个链节点,无头结点的循环链表 2.确定第一个报数人的位置 3.不断地从链表中删除链节点,直到链表为空。*/#if 0#include<stdio.h>#include<malloc.h>#define ERROR 0typedef struct LNode{int data;struct LNode *link; }LNode,*LinkList;void JOSEPHUS(int n,int k,int m) // n--总人数 k--第一个开始报数的人 m--出列者喊到的数{LinkList p,r,list,curr;//p为当前节点,r为辅助节点,指向p的前驱节点 list为头节点//创建循环链表p = (LinkList)malloc(sizeof(LNode)); p->data = 0;p->link = p;curr = p;for(int i = 1;i<n;i++){LinkList t = (LinkList)malloc(sizeof(LNode));t->data = i;t->link = curr->link ;curr->link = t;// 让表尾指向表头形成循环链表curr = t;}// 把当前指针移动到第一个报数的人r = curr; //把指针移动到编号为k的那个人上面while(k--) r = p; p = p->link ;while(n--){for(int s = m-1;s--;r = p,p = p->link);r->link = p->link;// p指向的是删除的那个数printf("%d->",p->data);free(p);p = r->link;}}int main(){JOSEPHUS(13,4,7);}#endif
阅读全文
0 0
- 约瑟夫问题、约瑟夫环
- Josephus约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题(Josephus)
- 约瑟夫环问题--java
- 约瑟夫环问题 Josephus
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 求解约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- Linux学习进阶路线图
- kali 做的几件事
- MySQL学习笔记
- [学习笔记]Android广播接收器BroadcastReceiver
- APP弱网模拟测试
- 约瑟夫环问题
- Erlang学习系列
- UVa 843
- Maven搭建Spring+Struts2+Hibernate项目详解
- 10.struts2_声明式异常的处理
- 【uoj35】后缀排序
- Python打开含中文字符文件的血案
- 2017第八届蓝桥杯C/C++ B组省赛题解(下)
- java服务端和android支付宝支付