用循环链表解决约瑟夫环问题

  • 格式:docx
  • 大小:14.17 KB
  • 文档页数:2

//用循环链表解决约瑟夫环问题
#include<iostream>
using namespace std;
typedef struct LNode
{
int date; //存放位数
struct LNode *next; //存放地址
}LNode,*Linklist;
void main()
{
Linklist s,p,l,q;
int i;
l=new LNode;
l->next=NULL; //建立空的带头链表
p=l;
int m,n;
cout<<"请输入总人数:"<<endl;
cin>>m;
for(i=1;i<=m;i++)
{
s=new LNode;
s->date=i;
s->next=p->next;
p->next=s;
p=p->next;
} //长度为m带头点的单链表
p->next=l->next; //循环链表,不带头结的
cout<<"请输入出列序号"<<endl;
cin>>n;
while(n<=1)
{
cout<<"输入错误,请重新输入"<<endl;
cin>>n;
}
i=0;
p=l;
while(p->next!=p) //若循环链表中有两个及以上人则进行循环{
i++;
if(i%n==0) //依次报数,当为n的倍数,删除除结点
{
q=p->next;
p->next=q->next;
delete q;
}
else//若不是n的倍数,指针后移
p=p->next;
}
cout<<"最后剩第"<<p->date<<"个人";
}。