约瑟夫问题
算法思路:用一个不带头结点的循环链表来处理Josephu问题,先构成一个有n个结点的单循环链表,然后从第k结点起从1计数,计到m时,对应结点从链表中删除;然后再从被删除结点的下一个结点起又从1开始计数……,直到所有结点都出列时算法结束。
void Josephu(Link L,int n, k, m)
{ int i ; Link p,r ;L=NULL; //置空表
for (i=1;i<=n;i++) //建立循环链表
{ p= (Link)malloc(sizeof(Lnode));
p->data = i;
if (L= =NULL) L=p;
else r->next=p;
r=p;}
p->next=L; //环起来
p=L;
for (i=1;i<=k–1;i++)
{ r=p; p=p->next; } //找到第k个结点
while (p->next!=p) //结点数>1时
{ for (i=1;i<=m-1;i++)
{ r=p; p=p->next; } //报数
r->next=p->next; //删除当前出列的p结点
printf (“%d”,p->data); //打印序号
free(p);
p=r->next;
//取下一报数的起点指针
}
printf (“%d\n”,p->data);}
//打印最后一个结点的序号
}
算法思路:用一个不带头结点的循环链表来处理Josephu问题,先构成一个有n个结点的单循环链表,然后从第k结点起从1计数,计到m时,对应结点从链表中删除;然后再从被删除结点的下一个结点起又从1开始计数……,直到所有结点都出列时算法结束。
void Josephu(Link L,int n, k, m)
{ int i ; Link p,r ;L=NULL; //置空表
for (i=1;i<=n;i++) //建立循环链表
{ p= (Link)malloc(sizeof(Lnode));
p->data = i;
if (L= =NULL) L=p;
else r->next=p;
r=p;}
p->next=L; //环起来
p=L;
for (i=1;i<=k–1;i++)
{ r=p; p=p->next; } //找到第k个结点
while (p->next!=p) //结点数>1时
{ for (i=1;i<=m-1;i++)
{ r=p; p=p->next; } //报数
r->next=p->next; //删除当前出列的p结点
printf (“%d”,p->data); //打印序号
free(p);
p=r->next;
//取下一报数的起点指针
}
printf (“%d\n”,p->data);}
//打印最后一个结点的序号
}
世界上幸福的事就是抓到一只羊,更幸福的事就是抓到两只羊……