1. 程式人生 > >約瑟夫問題(單迴圈連結串列解決)

約瑟夫問題(單迴圈連結串列解決)

/*Joseph Problem
 *利用單迴圈連結串列解決約瑟夫問題。
 *問題描述:將n個數連結成一個環,從第m個開始,每次從1計數到s時
 *          將s刪除。從下一個開始再次從1計數至s時刪除s。直到全
 *	    部刪除為止。
 * */
#include<stdio.h>
#include<stdlib.h>

typedef struct Node{
	int data;
	struct Node* next;
}Node;
typedef struct Node* LinkList;

void CreateJosephLoop(LinkList *L,int number){
//建立Joseph環,在頭結點中放入了元素1.
	*L = (LinkList)malloc(sizeof(struct Node));
	if(!(*L)){
		printf("Error:malloc:0!\n");
		exit(1);
	}
	(*L)->next = (*L);
	(*L)->data = 1;
	int i;
	LinkList new;
	LinkList tail = *L;
	for(i = 1; i < number; i++){
		new = (LinkList)malloc(sizeof(struct Node));
		if(!new){
			printf("Error:malloc:1+i");
			exit(1);
		}
		new->data = i+1;
		new->next = tail->next;
		tail->next = new;
		tail = new;
	}
}
void JosephProblem(int loopSize,int from,int stepBy){
//loopSize:Joseph環的大小
//form:從from開始
//stepBy:每次計數到stepBy時刪除stepBy所指向的元素
	LinkList L;
	CreateJosephLoop(&L,loopSize);
	int seekStart = 1;
	while(seekStart < from){
		L = L->next;
		seekStart += 1;
	}
	while(L->next != L){
		int i = 1;
		LinkList temp;
		for(i = 1;i < stepBy - 1; ){
			L = L->next;
			i++;
		}
		temp = L->next;
		printf("%d-->",temp->data);
		L->next = L->next->next;
		L = L->next;
		free(temp);
	}
	printf("%d\n",L->data);
}
int main(){
	JosephProblem(10,3,4);
	JosephProblem(41,1,3);
	return 0;
}