1. 程式人生 > >約瑟夫環——C語言迴圈連結串列模擬

約瑟夫環——C語言迴圈連結串列模擬

約瑟夫問題已知n個人圍城一週,編號1,2,3,.......,n,從1號開始報數,每隔k個人報到數的人出列。常見解決方法,遞迴或迴圈連結串列模擬迴圈連結串列模擬程式碼
#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;
}
模擬例項 編譯器DEVC++