循环单链表解决约瑟夫问题,哪里出错了呀,为什么出列顺序输出不了

#include "2.2.h"

int main()
{
LNode * L;
int n, s, m;
printf("有n个人,从s开始,数到m出列,请依次输入n,s,m的值:\n");
cin >> n >> s >> m;
InitList(L, n);
DispList(L,n);
printf("\n");

Josephu(L, n, s, m);
return 0;

}

void DispList(LNode* L, int n) //输出循环链表
{
printf("循环链表:\n");
for (int i = 0; i < n; i++)
{
printf("%d ",L->data);
L = L->next;
}

}

bool InitList(LNode*& L, int n) //初始化循环单链表,data值为1,2,3,4,...
{
L = (LNode*)malloc(sizeof(LNode));
if (L == NULL)
return false;
L->next = L;
L->data = 1;
LNode* p;
for (int i = n; i >1; i--)
{
p = (LNode*)malloc(sizeof(LNode));
if (p == NULL)
return false;
p->next = L->next;
L->next = p;
p->data = i;

}

}

bool Josephu(LNode*& L, int n,int s,int m) //n个人,从s开始,数到m出列
{
LNode* p = L;
LNode* q;
q = (LNode*)malloc(sizeof(LNode));

    for (int i = 1; i <= n; i++)
    {
        p = (LNode*)malloc(sizeof(LNode));
        if (p == NULL)
            return false;
        if (p->data == s)
            break;
        p = p->next;   //找出s的位置,并用p记录
    }

    printf("依次出列的顺序为:\n");
    for (int i = 0; i < n; i++) //n次出列
    {
        p = (LNode*)malloc(sizeof(LNode));
        if (p == NULL)
            return false;
        int j = 1;
        while (j < m)
        {
            p = p->next; //依次报数,当j=m时,结束循环,找到相应的p结点
            j++;

        }

       printf("%d ", p->data);
        //将当前数据域输出,并修改当前数据域为下一结点的数据域,并修改当前的数据域为下一结点的数据域,
        //同时指向下一结点的下一结点,用来删除当前结点
        
        q = p->next; //用q保存p的下一结点
        p->data = p->next->data;//p的数据域改为下一结点的数据域
        p->next = p->next->next;//指向下一结点
        free( q);

    }
}

img

Josephu函数,第一个循环就没写对
循环里你给p分配新的内存空间了,那后面的判断能成功才怪,它跟L没有一毛钱关系呀