数据结构 约瑟夫环问题C++
2016-02-18 15:41
357 查看
需求分析
本程序是用VC编写,由于约瑟夫问题是n个人围坐在一圈,所以采用循环链表实现,又由于报数时可能循环到开始,所以采用不带头结点的循环链表结构。
题目要求的约瑟夫环操作:编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。设计一个程序来求出出列顺序。
代码如下:
本程序是用VC编写,由于约瑟夫问题是n个人围坐在一圈,所以采用循环链表实现,又由于报数时可能循环到开始,所以采用不带头结点的循环链表结构。
题目要求的约瑟夫环操作:编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。设计一个程序来求出出列顺序。
代码如下:
<span style="font-size:18px;">#include<iostream> using namespace std; class Node { public: int Index; int password; Node *next; }; class Josephu { public: Josephu(int n,Node *L); private: Node *head; }; Josephu::Josephu(int n,Node *L) { head=L; Node* p=head; int i=1; for(i;i<n;i++) { p->Index=i; cin>>p->password; p->next= new Node(); p=p->next; } p->Index=i; cin>>p->password; p->next=head; } void func(int m,Node *head,int n) { int i,j; Node *p=new Node(); Node *q=head; while(n>1) { i=m%n; if(i==0) { i=m; } for(j=1;j<i;j++) { p=q; q=q->next; } p->next=q->next; cout<<q->Index<<" "; m=q->password; free(q); q=p->next; n--; } cout<<q->Index<<endl; } int main() { int m,n; cin>>m>>n; Node *L=new Node(); L->next=NULL; Josephu a(n,L); func(m,L,n); return 0; }</span>
相关文章推荐
- nginx源码初读(1)--让烦恼从数据结构开始(ngx_cdecl/ngx_int/ngx_log)
- 数据结构与算法
- 图的邻接矩阵c语言表示(无向网)---《数据结构》算法7.2
- 数据结构 魔王语言C++
- 数据结构——树
- 数据结构之栈(二)
- 数据结构之栈(一)
- 数据结构在程序中的实现及表现形式
- 数据结构绪论
- 数据结构:二叉树
- Java数据结构----栈(Stack)源码分析和个人简单实现
- 学习笔记------数据结构(C语言版)数组的顺序存储
- Python笔记(2)——数据类型和数据结构
- 数据结构学习笔记——二叉树的类型定义
- Nginx源码分析 - 基础数据结构篇 - 字符串结构 ngx_string.c
- 舞蹈链--求精密覆盖(数据结构)
- Dex文件结构及对应的数据结构
- 数据结构图文解析之:二分查找及与其相关的几个问题解析
- 数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
- 数据结构