/*
* 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("约瑟夫环 问题
");
//创建循环链表
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("
");
//记录当前是第几个人
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("
");
//释放内存
FreeSpace_CircleLinkList(clist);
return 0;
}