約瑟夫問題(單迴圈連結串列解決)
阿新 • • 發佈:2019-01-31
/*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; }