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