- 设有n个人围成一圈,每个人的编号依次1,2,3...n。现从编号?
- 设有n个人围成一圈,每个人的编号依次1,2,3...n。现从编号为k的人开始报数,
报到m的人出列,再从出列的下一个人开始重新报数,报到m的人又出列,以此类推,直到所有人都出列,求这n个人的出列顺序.
用编写算法,将结果以顺序表和单链表两种方法分别实现
注意:这种约瑟夫问题没有所谓的"输入密码"!
- #include
#include
typedef struct list
{
int data;
struct list *next;
}linklist;
void main()
{
int n,m,k,i=1;
linklist head,*p,*q,*l;
printf("enter n:\n");
scanf("%d",&n);
printf("enter m:\n",&m);
scanf("%d",&m);
printf("enter k:\n",&k);
scanf("%d",&k);
l=&head;
p=l;
for(;i<=n;i++)
{
q=(linklist *)malloc(sizeof(head));
p->next=q;
q->data=i;
p=q;
}
p->next=l->next; /*创建循环表*/
p=l->next;
for(i=1;inext;
while(p->data!=p->next->data)
{
for(i=1;inext;
q=p->next;
printf("%3d",q->data);
p->next=q->next;
p=q->next; /*p指向第k+1个人的位置*/
free(q); /*释放空间*/
}
printf("%3d\n",p->data);
free(l);
free(p);
}