1.4 joseph问题
Joseph问题:设编号分别为:1,2,…,n的n个人围坐一圈。约定序号为k
(1≤k≤n)的人从1开始计数,数到m的那个人出列,他的下一位又从1开始计
数,数到m的那个人又出列,依次类推,直到所有人出列为止。
二 双向循环链表
2.1 概念
//约瑟夫问题
void Joseph(int n,int k,int m)
{
//创建一个新的单向循环列表
looplist *h = LoopListCreate();
int i;
for(i = n; i >=1;i--)
{
LoopListInsert(h,i);
}
LoopListPrint(h);
h = LoopListCutHead(h);
LoopListPrint2(h);
//找到编号为k的人
for(i = 1; i < k;i++)
{
h = h->next;
}
//循环删除数到m的那个结点
looplist *tmp = NULL;
//循环结束的条件是只剩下最后一个结点
while(h->next != h)
{
//为了删除指定的结点,所以h指针保存数到m-1的结点
for(i = 1; i < m-1;i++)
{
h = h->next;
}
tmp = h->next;
h->next = tmp->next;
printf("%d ",tmp->data);
free(tmp);
tmp = NULL;
h = h->next;
// printf("m-1 = %d \n",h->data);
// break;
}
printf("%d \n",h->data);
free(h);
h = NULL;
}
评论0
最新资源