早教吧 育儿知识 作业答案 考试题库 百科 知识分享

跪求!C++!利用循环链表实现约瑟夫问题的求解约瑟夫问题如下:已知n个人(n>=1)围坐一圆桌周围,从1开始顺序编号。从序号为1的人开始报数,顺时针数到m的那个人出列;他的下一

题目详情
跪求! C++ ! 利用 循环链 表实现 约瑟夫 问题的求解
约瑟夫问题如下: 已知n个人(n>=1)围坐一圆桌周围,从1开始顺序编号。从序号为1的人开始报数,顺时针数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规则重复下去,直到所有人全部出列。请问最后一个出列的人的编号。 ( 最好能帮我把关键算法注释一下)
▼优质解答
答案和解析
#include
struct Node
{
int data;
Node *next;
};
void main()
{
int n,k,m,i,s;
Node *p,*q,*head;
cout< cin>>n;
cout< cin>>k;
cout< cin>>m;
head=new Node; //确定头结点
p=head;
for(i=1;i<=n-1;i++) //赋初值
{
p->data=i;
p->next=new Node; //为下一个新建内存
p=p->next;
}
p->data=n; //最后一个单独处理
p->next=head; //指向头,形成循环链表
p=head;

while(p->data!=(p->next)->data) //p->data==(p->pNext)->data表示只剩下一个结点的
{
while(p->data !=k) //寻找编号为k的结点
p=p->next;
s=1;
if(m==1)
{
for(i=1;i {
cout<data< p=p->next ;
}
cout<data<break;
}
else
{
while(p!=p->next)
{
for(i=1;ip=p->next;
q=p->next;
cout<data<p->next=q->next;
p=p->next;
delete q;
s++;
}
cout<data<delete p;
}
}}

/*这是今天刚做的,你看看应该可以吧,是C++的*/