循環リスト-ジョセフの問題(C言語)

ジョセフ問題は、次のように説明される循環リンクリストの典型的なアプリケーションです。

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;
    }

次の図は実行結果です
ここに画像の説明を挿入

元の記事を10件公開 12 件を獲得 1860年を訪問

おすすめ

転載: blog.csdn.net/qq_44236958/article/details/88984276