一组人(n个),围成一圈,从某人开始数到第三个的人出列,再接着从下一个人开始数,最终输出最终出列的人
(约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。)
#include<iostream>
using namespace std;
typedef struct node
{
int data;
struct node *next;
}linklist;
linklist *creat(linklist *head,int n)
{
int i=1;
linklist *p,*q;
p=new linklist;
p->data=i;
head=p;
for(i=2;i<=n;i++)
{
q=new linklist;
q->data=i;
p->next=q;
p=q;
}
p->next=head;
return head;
delete [] p;
delete [] q;
}
void display(linklist *head,int n)
{
linklist *p;
p=head;
int i=1;
while(i<=n)
{
cout<<p->data<<" ";
p=p->next;
i++;
}
cout<<endl;
}
void delete_m(linklist *head,int m)
{
linklist *p,*q,*temp;
p=head;
int i=1;
while(p!=p->next)
{
q=p;
p=p->next;
i++;
if(i==m)
{
i=1;
temp=p;
cout<<p->data<<" ";
q->next=p->next;
p=p->next;
free(temp);
}
}
cout<<p->data<<endl;
}
int main()
{
linklist *head=(linklist *)malloc(sizeof(linklist));
head=NULL;
int n;
cout<<"input the num n:"<<endl;
cin>>n;
head=creat(head,n);
display(head,n);
cout<<"输入要删除的数m:";
int m;
cin>>m;
delete_m(head,m);
}