約瑟夫環——C語言迴圈連結串列模擬
阿新 • • 發佈:2019-01-25
約瑟夫問題已知n個人圍城一週,編號1,2,3,.......,n,從1號開始報數,每隔k個人報到數的人出列。常見解決方法,遞迴或迴圈連結串列模擬迴圈連結串列模擬程式碼
模擬例項 編譯器DEVC++#include<stdio.h> //以30個人為例 ,每7個人出列為例 #include<malloc.h> #define elemtype int #define status int #define ok 1 #define fail 0 typedef struct list{ //定義連結串列結構 elemtype data; list *next; }linklist , *linklistpoint ; int initlinklist(linklistpoint l) //初始化迴圈連結串列 { int i = 1; linklistpoint m,n; m = l; n = l; for(i = 1;i<=30;i++) //總共30個節點 { m->data = i; if(i != 30){ n = (linklist*)malloc(sizeof(linklist)); m->next = n; m = n; } else m->data = i; //將每個節點相應編號 m->next = l; } return m->data ; //返回總個數 } status joseph(linklistpoint l,int i) //模擬函式 { int answer; //存放最終結果 linklistpoint m; linklistpoint x; int n; m = l; x = l; n = 1; //當只剩最後一個節點時,模擬結束 while(m->next != m ){ for(n = 1;n < i-1;n++) //每7人出列一個 { m = m->next; } printf("%d->",m->next->data); //列印刪去的節點 x = m->next; m->next = x->next; m = m->next; } answer = m->data; return answer; } int main(){ linklist l; linklistpoint p; int answer; int i; p = &l; answer = initlinklist(p); i = 7; printf("%d\n",answer); answer = joseph(p,i); printf("%d",answer); return 0; }