/* * Josephus.c * * Created on: 2019年7月25日 * Author: Administrator */ #include "CycleLinkList.h" #include <stdlib.h> #include <stdio.h> #include <string.h> #define M 8 #define N 3 typedef struct MYNUM { CircleLinkNode node; int val; } MyNum; void MyPrint(CircleLinkNode *data) { MyNum *num = (MyNum *)data; printf("num: %d ",num->val); } int MyCompare(CircleLinkNode *data1, CircleLinkNode *data2) { MyNum *num1 = (MyNum *)data1; MyNum *num2 = (MyNum *)data2; if(num1->val == num2->val){ return CIRCLELINKLIST_TRUE; } } int main() { printf("約瑟夫環 問題 \n"); //建立循環鏈表 CircleLinkList *clist = Init_CircleLinkList(); //鏈表插入數據 MyNum num[M]; for(int i = 0; i < 8; i++){ num[i].val = i + 1; Insert_CircleLinkList(clist, i, (CircleLinkNode *)&num[i]); } //打印 Print_CircleLinkList(clist, MyPrint); printf("\n "); //記錄當前是第幾我的 int index = 1; //輔助指針 CircleLinkNode *pCurrent = clist->head.next; while(Size_CircleLinkList(clist) > 1) { if(index == N) { MyNum *temNum = (MyNum*)pCurrent; printf("%d ", temNum->val); //緩存待刪除節點的下一個節點 CircleLinkNode *pNext = pCurrent->next; //根據值 刪除 RemoveByValue_CircleLinkList(clist, pCurrent, MyCompare); pCurrent = pNext; if(pCurrent == &(clist->head)){ pCurrent = pCurrent->next; } index = 1; } pCurrent = pCurrent->next; if(pCurrent == &(clist->head)){ pCurrent = pCurrent->next; } index++; } //輸出最後一個元素 if(Size_CircleLinkList(clist) == 1) { MyNum* tempNum = (MyNum *)Front_CircleLinkList(clist); printf("%d", tempNum->val); }else{ printf("出錯"); } printf("\n "); //釋放內存 FreeSpace_CircleLinkList(clist); return 0; }