單向循環鏈表(如何實現約瑟夫環)

約瑟夫問題:總共有n個人排成一圈,從某個人開始,按順時針方向依次編號。從編號爲1的人開始順時針報數1(下一個報號2),報到m的人退出圈子然後重新從1開始順時針報數。這樣不斷循環下去,圈子裏的人將不斷減少。要求全部人員輸出退出順序。

#include<stdio.h>
#include<stdlib.h> 
struct Node{
	int num;
	Node *next;
};

int main(){
	int len, a=2;
	Node *end, *r;
	end = (Node*)malloc(sizeof(Node));
	r = (Node*)malloc(sizeof(Node));
	scanf("%d", &len);
	
	//尾插法構建循環鏈表 
	end->num=1;
	end->next=end;
	for(int i=1; i<len; i++){
		Node *s = (Node*)malloc(sizeof(Node));
		s->num=a++;
		s->next=end->next;
		end->next=s;
		end=s;
	}
	
	//開始報數殺人
	int m, count=0;
	scanf("%d", &m);
	r = end;
	
	while(1){
		//數到 m 殺一人 
		if(count==m-1){
			count=0;
			printf("每次被殺的序號:%d\n", r->next->num);
			r->next=r->next->next; 
			len--;
			if(len==0){
				break;
			}
		}
		count++;
		r = r->next;
	}
	
	return 0;
} 

一直將自己的學習經驗分享給有需要的人。
我是小鄭,一個堅持不懈的小白

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