#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
typedef struct Node
{
int data;
struct Node* next;
} Node;
int Create(Node** joseph,int num)
{
if (joseph == NULL || num < 1)
{
return ERROR;
}
Node* head = (Node*)malloc(sizeof(Node));
head->next = NULL;
Node* p = head;
for (size_t i = 1; i <= num; i++)
{
Node* node = (Node*)malloc(sizeof(Node));
node->data = i;
node->next = head;
p->next = node;
p = node;
}
p->next = head->next;
free(head);
*joseph = p->next;
return OK;
}
int Length(Node* joseph)
{
if (joseph == NULL)
{
return 0;
}
Node* target = joseph;
int length = 1;
for (; target->next!=joseph; target = target->next)
{
length++;
}
return length;
}
int ShowKill(Node* joseph,int n)
{
if (joseph == NULL)
{
return ERROR;
}
int num = Length(joseph);
int skip = n-1;
Node* p = joseph;
Node* begin = p;
while (1)
{
begin = p;
for (size_t i = 0; i < skip-1; i++)
{
p = p->next;
}
if (begin == p->next)
{
printf("->%d", begin->data);
printf("->%d", begin->next->data);
free(begin);
free(p);
begin = NULL;
p = NULL;
break;
}
Node* kill = p->next;
printf("-->%d", kill->data);
p->next = kill->next;
free(kill);
kill = NULL;
p = p->next;
}
printf("\n");
return OK;
}
int main(int argc, char *argv[])
{
Node* joseph = NULL;
int num = 1;
while (num)
{
printf("请输入约瑟夫环人数(输入0退出):");
scanf("%d", &num);
if (!num)
{
break;
}
printf("约瑟夫环死亡顺序:\n");
joseph = NULL;
Create(&joseph,num);
ShowKill(joseph, 3);
}
return 0;
}