[轉]用單向循環鏈表解決約瑟夫環問題

設有n個人圍坐一圈,現以某個人開始報數,數到m的人出列,接着從出列的下一個人開始重新報數,數到m的人又出列,如此下去,直到所有人都出列爲止.按出列順序輸出. 

這段代碼是從網上找來的,在此特別說明!!!!!

C代碼
  1. #include   "stdlib.h"   
  2. struct  ele {  
  3.     int  no;  
  4.     struct  ele *link;  
  5. } main() {   
  6.   
  7.     struct  ele *h, *u, *p;  
  8.     int  n, m, i;  
  9.     printf("Please   input   n&m:/n" );  
  10.     scanf("%d%d" , &n, &m); /*輸入n和m*/   
  11.     h = u = (struct  ele *) malloc( sizeof ( struct  ele)); /*形成首表元*/   
  12.     h->no = 1;  
  13.     for  (i = 2; i <= n; i++) /*形成其餘的n-1個表元*/   
  14.     {  
  15.         u->link = (struct  ele *) malloc( sizeof ( struct  ele));  
  16.         u = u->link;  
  17.         u->no = i;/*第i個表元置編號i*/   
  18.     }  
  19.     u->link = h;/*末表元后繼首表元,形成環*/   
  20.     puts(  
  21.             "/nThe   numbers   of   who   will   quit   the   cycle   in   turn   are:" );  
  22.     while  (n) {  
  23.         for  (i = 1; i < m; i++)  
  24.             /*掠過m-1個表元*/   
  25.             u = u->link;  
  26.         p = u->link;/*p指向第m個表元*/   
  27.         u->link = p->link;/*第m個表元從環中脫鉤*/   
  28.         printf("%4d" , p->no);  
  29.         free(p);/*釋放第m個表元佔用的空間*/   
  30.         n--;  
  31.     }  
  32.     printf("/n/n   Press   any   key   to   quit.../n" );  
  33.     getchar();  
  34. }   

      當碰到問題,首先考慮這個問題是怎樣的類型,第二從解決列表中選擇中最合適的方案.以這個問題爲例:問題中是一個循環性質,關鍵點“有n個人圍坐一圈”。 可選數據結構與算法中的可選方案:隊列,棧,線性表,串。隊列,棧和串都不大合適。以線性表中的單向循環鏈表最合適。

 

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