#include"stdio.h"
#include"malloc.h"
typedef struct Node
{
int data;
struct Node* next;
}Node;
void Josephu(int n, int k, int m)
{
if (n <= 0)
{
//报错
return;
}
Node* head = NULL, * p = NULL, * q = NULL;//申请对象的时候或指针的时候要养成初始化的习惯,防止后续调用的时候没有初始化
int i = 0;//虽然后续使用的时候赋值了,但是还是建议初始化一下,养成良好习惯
for (i = 1; i <= n; i++)
{
p = (Node*)malloc(sizeof(Node));
p->data = i;
p->next = NULL;//p = (Node*)malloc(sizeof(Node));只是申请了内存,并没有初始化next指针,这最好初始化一下,避免出现问题
if (head == NULL) {
head = p;
}
else {
//这个位置的报错,我觉得是没有必要修改,不影响整体运行逻辑
//如果一定要修改就修改为
/*
if(q == NULL) q = head;
q->next = p;
*/
q->next = p;
}
q = p;
}
//这里最好判断一下p的值,因为n == 0的时候p的值是NULL,也可以在函数最前面判断n,k,m的合法性
if (p == NULL)
{
return;
}
p->next = head;
p = head;
for (i = 1; i < k; i++)
{
q = p;
p = p->next;
}
printf("出列顺序依次为:");
while (p != q)
{
for (i = 1; i < m; i++)
{
q = p;
p = p->next;
}
q->next = p->next;
printf("%4d", p->data);
free(p);
p = q->next;
}
printf("%4d\n", p->data);
}
void main()
{
int n, k, m;
printf("输入n的值:");
scanf_s("%d", &n);
printf("输入k的值:");
scanf_s("%d", &k);
printf("输入m的值:");
scanf_s("%d", &m);
Josephu(n, k, m);
}