ジョセフ問題は、次のように説明される循環リンクリストの典型的なアプリケーションです。
m人は、時計回りの順序で、いずれか1つから
始まり、全員が1からカウントを開始するように円を形成し、nに報告する人はデキューされます。次に、nの後の
人を1からカウントを開始し、再びnをデキューするように報告した人を作成します...だから
、列の順序と最後に残った人の数を調べます
mおよびnを特定の数に設定して、m = 8およびn = 3がジョセフ問題をシミュレートするようにします。
この関数に関する完全なコードは次のとおりです
#include<stdio.h>
#include<stdlib.h>
typedef struct CLinkList
{ int data;
struct CLinkList *next;
}node;
int main()
{ node *L,*r,*s;
L =(node*)malloc(sizeof(node));
r =L;
int n = 8,i,k = 3;
for(i = 1;i<=n;i++)
{ s = (node*)malloc(sizeof(node));
s->data = i;
r->next = s;
r= s;
}
r->next =L->next; //让最后一个结点指向第一个有数据结点
node *p;
p = L->next;
delete L; //删除第一个空的结点
while(p->next != p) //判断条件:因为最后肯定剩下一个人,
循环链表的最后一个数据的next还是他本身
{for(i = 1;i<k-1;i++)
{p = p->next; } //每k个数出列一个人
printf("%d,",p->next->data);
p->next = p->next->next; //将该节点从链表上删除。
p = p->next;
}
printf("%d,",p->next->data);
return 0;
}
次の図は実行結果です