约瑟夫问题
//n个人围圈报数,报m出列,最后剩下的是几号?
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
intdata;
structnode *next;
}node;
node *create(int n)
{
node*p = NULL, *head;
head= (node*)malloc(sizeof (node ));
p= head;
node*s;
inti = 1;
if(0 != n )
{
while(i <= n )
{
s= (node *)malloc(sizeof (node));
s->data= i++; // 为循环链表初始化,第一个结点为1,第二个结点为2。
p->next= s;
p= s; //这里是先得到一块内存,在下一次分配内存之后再填指针域的值。
}
s->next= head->next;
}
free(head);
returns->next ;
}
int main()
{
intn = 41;
intm = 3;
inti;
node*p = create(n);
node*temp;
m%= n; // m在这里是等于2
while(p != p->next )
//控制条件,当这个节点的指针域指向自身时,说明只剩一个节点
{
for(i = 1; i < m-1; i++)
{
p = p->next[R1] ;
}
//此处,p是第二个节点的首地址
printf("%d->",p->next->data );
//此处,p->next是第三个节点的首地址
temp= p->next ;
//此处,temp是第三个节点的首地址[R2]
p->next= temp->next ;
//此处,temp->next是第四个节点的首地址
free(temp);
p = p->next ;
}
printf("%d\n",p->data );
return0;
}