2.约瑟夫环的实现:设有n个人围坐在圆桌周围,现从某个位置 i 上的人开始报数,数到

问题描述:

2.约瑟夫环的实现:设有n个人围坐在圆桌周围,现从某个位置 i 上的人开始报数,数到
1.任意输入队列长度和队列中的元素值,构造一个顺序循环队列,对其进行清空、插入新元素、返回队头元素以及删除队头元素操作.
2.约瑟夫环的实现:设有n个人围坐在圆桌周围,现从某个位置 i 上的人开始报数,数到 m 的人就站出来.下一个人,即原来的第m+1个位置上的人,又从1开始报数,再是数到m的人站出来.依次重复下去,直到全部的人都站出来,按出列的先后又可得到一个新的序列.由于该问题是由古罗马著名的史学家Josephus提出的问题演变而来,所以通常称为Josephus
例如:当n=8,m=4,i=1时,得到的新序列为:
4,8,5,2,1,3,7,6
编写程序选择循环队列作为存储结构模拟整个过程,并依次输出出列的各人的编号.
数据结构的实验谢谢
1个回答 分类:综合 2014-09-26

问题解答:

我来补答
约瑟夫问题:
#include
struct Node
{
int data;
Node *pNext;
};
void main()
{
int n,k,m,i;
Node *p,*q,*head;
coutn;
coutk;
coutm;
head=(Node*)new Node; //确定头结点
p=head;
for(i=1;idata=i;
p->pNext=(Node*)new Node; //为下一个新建内存
p=p->pNext;
}
p->data=n; //最后一个单独处理
p->pNext=head; //指向头,形成循环链表
p=head;
while(p->data!=(p->pNext)->data) //p->data==(p->pNext)->data表示只剩下一个结点的
{
while(p->data !=k) //寻找编号为k的结点
p=p->pNext;
if(m==1)
{
for(i=1;i
 
 
展开全文阅读
剩余:2000