c语言,链表问题,约瑟夫杯,

问题遇到的现象和发生背景

N个人围成一圈顺序编号,从1号开始按1、2、3顺序报数,报p者退出圈外,其余的人再从1、2、3开始报数,报p的人再退出圈外,以此类推。 请按退出顺序输出每个退出人的原序号。

输入格式:
输入只有一行,包括一个整数N(1<=N<=3000)及一个整数p(1<=p<=5000)。

输出格式:
按退出顺序输出每个退出人的原序号,数据间以一个空格分隔,但行尾无空格。

问题相关代码,请勿粘贴截图

#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int data;
struct Node *next;
}node;

int kong(node *l)
{
if(l->next=l) return 0;
else return 1;
}

node *tou(){
node l;
l=(node
)malloc(sizeof(node));
l->next=l;
return l;
}
void Creatlist(node *l,int n){
node *q;
q=l;
for(int i=1;i<=n;i++)
{
node *p;
p=(node*)malloc(sizeof(node));
p->data=i;
p->next=l;
q->next=p;
q=q->next;
}
}
void yuesefu(node *l,int p)
{
node *m;
m=l->next;
int a=1;
while(kong(l)){
if(a==p){
printf("%d\n",m->data);
node *n;
n=m;
m=m->next;
free(n);
a=0;
}
else
{a++;m=m->next;}
}

}

int main()
{
int n,p;
scanf("%d%d",&n,&p);
node *l;
l=tou();
Creatlist(l,n);
yuesefu(l,p);
return 0;
}

运行结果及报错内容
我的解答思路和尝试过的方法

这是我写的代码,没有编辑错误,但是没有输出,这是怎么回事?希望各位不吝赐教

我想要达到的结果

kong 里面改为 == 或者

int kong(node *l)
{
    return !(l->next == l);
}


#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
    int data;
    struct Node *next;
} node;

node *Creatlist(int n)
{
    node *l, *q, *p;
    l = (node *)malloc(sizeof(node));
    l->data = 1;
    l->next = l;
    q = l;
    for (int i = 2; i <= n; i++)
    {
        p = (node *)malloc(sizeof(node));
        q->next = p;
        p->data = i;
        p->next = q;
        q = p;
    }
    q->next = l;

    return l;
}

void yuesefu(node *l, int p)
{
    node *m, *n;
    m = n = l;
    int a = 1, data = l->data;
    while (m->next != m)
    {
        if (a == p)
        {
            printf("%d ", m->data);
            n->next = m->next;
            if (m->data == data) //重置头结点
            {
                l = m->next;
                data = l->data;
            }
            free(m);
            m = n->next;
            a = 1;
        }
        else
        {
            a++;
            n = m;
            m = m->next;
        }
    }
}


int main()
{
    int n, p;
    scanf("%d%d", &n, &p);
    node *l = Creatlist(n);
    // l = tou();
    // Creatlist(l, n);
    yuesefu(l, p);

    return 0;
}