#include<iostream>
using namespace std;
//小孩结点类型
struct Child{
int no; //小孩编号
Child* next; //指针域,指向下一个指针
};
//设计运算算法
class Joseph
{
int n, m;
Child *h; //首结点指针
public:
Joseph(int n1, int m1) //构造函数, 建立有n1歌结点的循环单链表
{
int i ;
Child *p, *r; //r指向新建链表的尾结点
n = n1;
m = m1;
h = new Child();
h->no = 1; //先建立只有一个no为1 的结点的单链表
r = h;
for(i = 2; i <= n; i++)
{
p = new Child();//建立一个新结点
p->no = i; //新结点存放编号i
r->next = p; //将*p结点链接到末尾
r = p; //构成一个首结点为h的循环单链表
}
r->next = h;
}
~Joseph() //析构函数, 所有结点在出列时已释放
{}
void Jsequence() //求约瑟夫序列
{
int i , j;
Child*p, *q;
for(i = 1; i <= n; i++)//共出列n个孩子
{
p = h;
j = 1;
while(j < m-1) //从*h结点开始报数, 报到第m-1个节点
{
j++; //报数递增
p = p->next;//移到下一个结点
}
q = p->next; //q指向第m个结点
cout << q->no << " ";//该节点的小孩出列
p->next = q->next; //删除*q结点
delete q; //释放其空间
h = p->next; //从下一个结点从新开始
}
}
};
int main()
{
int n = 6;
int m = 5;
Joseph obj(n,m);
cout << "n = " << n << " , m = " << m << " 的约瑟夫序列:";
obj.Jsequence();
cout << endl;
return 0;
}
数据结构(三):循环单链表解决约瑟夫问题
最新推荐文章于 2022-09-18 22:52:58 发布