1 /*Joseph Problem 2 *利用单循环链表解决约瑟夫问题。 3 *问题描述:将n个数链接成一个环,从第m个开始,每次从1计数到s时 4 * 将s删除。从下一个开始再次从1计数至s时删除s。直到全 5 * 部删除为止。 6 * */
7 #include<stdio.h>
8 #include<stdlib.h>
9
10 typedef struct Node{ 11 int data; 12 struct Node* next; 13 }Node; 14 typedef struct Node* LinkList; 15
16 void CreateJosephLoop(LinkList *L,int number){ 17 //创建Joseph环,在头结点中放入了元素1.
18 *L = (LinkList)malloc(sizeof(struct Node)); 19 if(!(*L)){ 20 printf("Error:malloc:0!\n"); 21 exit(1); 22 } 23 (*L)->next = (*L); 24 (*L)->data = 1; 25 int i; 26 LinkList new; 27 LinkList tail = *L; 28 for(i = 1; i < number; i++){ 29 new = (LinkList)malloc(sizeof(struct Node)); 30 if(!new){ 31 printf("Error:malloc:1+i"); 32 exit(1); 33 } 34 new->data = i+1; 35 new->next = tail->next; 36 tail->next = new; 37 tail = new; 38 } 39 } 40 void JosephProblem(int loopSize,int from,int stepBy){ 41 //loopSize:Joseph环的大小 42 //form:从from开始 43 //stepBy:每次计数到stepBy时删除stepBy所指向的元素
44 LinkList L; 45 CreateJosephLoop(&L,loopSize); 46 int seekStart = 1; 47 while(seekStart < from){ 48 L = L->next; 49 seekStart += 1; 50 } 51 while(L->data != L->next->data){ 52 int i = 1; 53 LinkList temp; 54 for(i = 1;i < stepBy - 1; ){ 55 L = L->next; 56 i++; 57 } 58 temp = L->next; 59 printf("%d-->",temp->data); 60 L->next = L->next->next; 61 L = L->next; 62 free(temp); 63 } 64 printf("%d\n",L->data); 65 } 66 int main(){ 67 JosephProblem(10,3,4); 68 JosephProblem(41,1,3); 69 return 0; 70 }
约瑟夫问题C代码
原文作者:robin_X
原文地址: https://www.cnblogs.com/robin-xu/p/5185745.html
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://www.cnblogs.com/robin-xu/p/5185745.html
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。