单向循环链表实现约瑟夫问题

来源:互联网 发布:免费html游戏网站源码 编辑:程序博客网 时间:2024/05/16 12:30

// 约瑟夫问题:

/*

问题描述:

输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知),和初始计数值m。

从数列第k个位置开始计数,计数到m后,将数列该位置数值替换计数值m,并将数列该位置数值出列,

然后从下一位置从新开始计数,直到数列所有数值出列为止。如果计数到达数列尾段,则返回数列首位置继续计数。

请编程实现上述计数过程,同时输出数值出列的顺序

比如: 输入的随机数列为:3,1,2,4,初始计数值m=7,从数列首位置开始计数(数值3所在位置)
第一轮计数出列数字为2,计数值更新m=2,出列后数列为3,1,4,从数值4所在位置从新开始计数
第二轮计数出列数字为3,计数值更新m=3,出列后数列为1,4,从数值1所在位置开始计数
第三轮计数出列数字为1,计数值更新m=1,出列后数列为4,从数值4所在位置开始计数
最后一轮计数出列数字为4,计数过程完成。
输出数值出列顺序为:2,3,1,4。

入口参数:

n:输入的字符的个数 

k: 初始计数位置

m: 初始计数值m

*/

void josephus(int n,int k,int m)
{
LinkList head;
InitList_loop(head);
for(int i=1;i<=n;i++)
{
ListInsert_loop(head,i,i);
}
Travese_loop(head,print);

LinkList P,q;
P = head;


while(P->next!=P)
{
for(int j=1;j<m+k;j++)
{
q = P;
P = P->next;
if(P == head)
m++;
}
m = P->data ;
   print(m);
q->next = P->next; // delete P node;
P = P->next;
k = 0;
}
}
原创粉丝点击