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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Lnode *tail,*p;
head=(Lnode*)malloc(sizeof(Lnode)); //创建头节点
head->next=head;
tail=head;
for(int i=0;i<n;i++) //创建单循环链表
{
p=(Lnode*)malloc(sizeof(Lnode));
p->data=(i+1);
tail->next=p;
tail=p;
p->next=head->next;
}
}
void JosephusCircle::Josephus()
{
Lnode *p=head->next;
Lnode *q=head; //q指针紧随其后
int j=1;
while (j!=s) //找到报数起点
{
p=p->next;
}
void main()
{
JosephusCircle Jose;
Jose.creat_list();
cout<<"出圈顺序为:"<<endl;
Jose.Josephus();
cout<<endl;
}
//用单循环链表解决约瑟夫问题
#include <iostream>
using namespace std;
typedef struct Lnode
{
int data;
Lnode *next;
}Lnode;
class JosephusCircle
{
public:
void creat_list();
void Josephus();
private:
int n;
int s;
int m;
Lnode *head;
};
void JosephusCircle::creat_list() //初始化
{
cout<<"请依次输入,约瑟夫圈人数、报数起始位置、报几个数:"<<endl;
cin>>n>>s>>m;
if(m==0) { cout<<"报数的个数不许为0!"; cout<<endl; exit(1); }
q=q->next;
++j;
}
while (p!=q)
{
for(int i=0;i<m-1;i++) //报数出圈
{
p=p->next;源自文库
q=q->next;
}
cout<<p->data<<' '; //输出前n-1个出圈人编号
p=p->next; //删除节点
q->next=p;
}
cout<<p->data; //输出最后一个出圈人编号
相关文档
最新文档