#include
typedef struct LNode{
int data;
struct LNode *next;
} Linklist;
static int aaa;
Linklist * creatlist(int renshu)
{ int x,i;
Linklist *head, *p,*r;
head=new(struct LNode);
r= head;
printf("请输入第1个人的密码:");
scanf("%d",&x);
printf("\n");
r->data=x;
for(i=1;i
printf("请输入第%d个人的密码:",i+1);
scanf("%d",&x);
p=new(struct LNode);
p->data=x;
r->next=p;
r=p;
printf("\n");
}
r->next=head;
/*//测试单循环
printf("\n-------------------\n");
r=head;
for(i=1;i<=10;i++){
p = r;
printf("%d",p->data);
r = p->next;
}
printf("\n-------------------\n");
*/
return(head);
}
Linklist *pop(Linklist *HEAD,int k){
Linklist *p,*r;
int i;
r = HEAD;
for(i=1;i
p = r;
r = p->next;
}
aaa = r->data;
p->next = r->next;
HEAD = p;
return(p);
}
void main(void)
{
int renshu,m,i;
Linklist *List,*p,*r;
printf("欢迎玩此游戏,游戏名字:约瑟夫环\n第一次玩(Y/N)?");
char ch;
ch = getchar();
if(ch=='Y'||ch=='y')printf("\n游戏规则:编号为1,2… n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他的顺时针方向上的下一个开始重新从1报数,如此下去,直至所有人全部出列为止。\n\n—————————————那么,现在就让我们开始吧!——————————————\n ");
printf("\n请输入玩的人数:");
scanf("%d",&renshu);
printf("\n请任意输入一个数作为报数:");
scanf("%d",&m);
printf("\n");
aaa = m;
List=creatlist(renshu);
printf("游戏开始,点名!\n");
ch=getchar();ch = getchar();
printf("第1个人被点到,出列!\t公布他的密码为");
if(m==1){
r = List;
p = r;
aaa = r->data;
for(i=1;i<=renshu;i++){
if(p->next==r){
p->next = r->next;
r = r->next;
}
else{p = p->next; };
}
printf("%d。\t且由他的密码作为新的报数!\n",aaa);
}
else{
List = pop(List,aaa);
printf("%d。\t且由他的密码作为新的报数!\n",aaa);
}//这里的IF,ELSE语句防止了一个BUG的出现(经过多次测试,当报数为1的时候,无法删除第一个人)这个语句防止了此BUG
for(i=1;i
List = pop(List,aaa+1);
ch = getchar();
printf("\n第%d个人被点到,出列!\t公布他的密码为%d。\t且由他的密码作为新的报数!\n",i+1,aaa);
}
ch = getchar();
printf("\n人物已全部出列!\n");
ch = getchar();
printf("——————————————程序结束,按回车键退出!——————————————");
ch = getchar();
}
#include
struct node
{int data;
node *next;
};
class link
{
public:
link(int m);
void Delete(int r);
private:
node *first;
};
link::link(int m)
{
int i;
node *r,*s;
first=new node;
first->data=1;
r=first;
for(i=1;i
s->data=i+1;
r->next=s;
r=s;
}
r->next=first;
}
void link::Delete(int r)
{
int x,c;
int s=0;
node *q,*p;
q=first;
p=first->next;
c=2;
while(p!=q)
{
if(c==r)
{
x=p->data;
q->next=p->next;
c=1;
++s;
cout<<"第"< cout<< x<
}
else{
q=q->next;
p=q->next;
c++;
}
}
s++;
cout<<"第"< cout<< p->data<
}
void main()
{
int i,j;
int n1,n2;
cout<<"请输入圈内总人数:";
cin>>n1;
cout<<"请输入密码值:";
cin>>n2;
link str(n1);
str.Delete(n2);
}
约瑟夫问题,百度一下约瑟夫有好多源代码的啊
回家了帮你弄~