約瑟夫問題(單循環鏈表解決)


/*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;
}



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com