【約瑟夫】編程實現約瑟夫環

已知 n 個人(以編號1, 2, 3 ,4, 5 ,6  ... .. .n)圍坐一張圓桌周圍。從編號爲k 的人開始報數,數到m 的那個人出列;他的下一個人又從 1開始報數,數到m的那個人又出列;依次規律重複下去,直到圓桌周圍的人全部出列。請用C++編程。

整個程序分爲3個步驟:

第一步:建立一個有n個元素的循環鏈表,鏈表是從1的編號開始的。

第二步:是從鏈表的表頭數到第 k 個值。

第三步:從 k 的後面開始輸入 m 個值,刪除該值,繼續開始數,繼續刪。。。。。。。,直到刪除完。


  1. #include <iostream>  
  2. using namespace std;  
  3. #define  ERROR 0  
  4. typedef struct LNode  
  5. {  
  6.     int data;  
  7.     struct LNode *link;  
  8.     LNode()  
  9.     {  
  10.         data = 0;  
  11.         link = NULL;  
  12.     }  
  13. }LNode,*LinkList;  
  14.   
  15. /************************************************************************/  
  16. /*  n 爲總人數                                                          */  
  17. /*  k 爲第一個開始報數的人                                              */  
  18. /*  m爲出列者喊到的數                                                   */  
  19. /************************************************************************/  
  20. void Josephus(int n,int k,int m)  
  21. {  
  22.     //pnode 爲當前節點,secondnode爲輔助節點,指向pnode的前驅節點,list爲頭結點  
  23.     if(n<0||k<0||m<0) return;  
  24.     LinkList pnode,prenode,curr;  
  25.     pnode = new LNode();  
  26.     pnode->data = 1;  
  27.     pnode->link  = pnode;            //建立一個循環鏈表  
  28.     curr = pnode;  
  29.     for (int i=2;i<=n;i++)  
  30.     {   
  31.         LinkList  temp = new LNode();  
  32.         temp->data = i;  
  33.         temp->link = curr->link;  
  34.         curr->link = temp;  
  35.         curr = temp;  
  36.     }  
  37.     prenode = curr;  
  38.     while(k--)   
  39.     {  
  40.         prenode = pnode;        //prenode是pnode的前一個結點。  
  41.         pnode = pnode->link; //移動結點 pnode是第k個元素  
  42.     }  
  43.     while(n--)  
  44.     {  
  45.         //for 是移動m個位置pnode是移動到的m位置,prenode是pnode的前一個結點  
  46.         for (int s=m;--s;prenode = pnode,pnode = pnode->link);  
  47.         prenode->link = pnode->link; //刪除pnode結點  
  48.         printf("%d   ",pnode->data); //打印刪除的結點  
  49.         free(pnode);                //釋放空間  
  50.         pnode = prenode->link;       //從prenode的下一個結點開始,數一個m個結點的值。         
  51.     }  
  52. }  
  53. void main()  
  54. {  
  55.     Josephus(5,3,1);  
  56.     system("pause");  
  57. }  

運行的結果:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章