链队列解决约瑟夫环问题

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

链队列解决约瑟夫环问题。
题目描述:
编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。
一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数
(1)如果报的数不是m,则出列,再加入队列尾部
(2)报到m时停止报数。报m的人出列,将它的密码作为新的m值,从它的顺时针方向的下一个人开始重新从1报数
(3)如此下去,直至全部人出列为止。
最后按照出列的顺序输出各人的编号。

用代码块功能插入代码,请勿粘贴截图

我的代码如下:
#include
#include

typedef int DataType;
typedef struct qnode
{
DataType data;
DataType password;
struct qnode *next;
}LinkListQ;
typedef struct
{
LinkListQ *front,*rear;
}LinkQueue;

LinkQueue *InitQueue()
{ /初始化链队列函数/
LinkQueue *Q;
LinkListQ *p;
Q=(LinkQueue *)malloc(sizeof(LinkQueue));
p=(LinkListQ *)malloc(sizeof(LinkListQ));
Q->front=p;
Q->rear=p;
return Q;
}
,
int EmptyQueue(LinkQueue *Q)
{ /判断队空函数/
if(Q->front==Q->rear)
return 1;
else
return 0;
}

void InQueue(LinkQueue *Q,DataType x,DataType y)
{ /入队函数/
LinkListQ *p;
p=(LinkListQ *)malloc(sizeof(LinkListQ));
p->data=x;
p->password=y;
p->next=NULL;
Q->rear->next=p;
Q->rear=p;
}

int DeQueue(LinkQueue *Q,DataType *x,DataType *y)
{ /出队函数/
LinkListQ *p;
if(EmptyQueue(Q))
return 0;
else
{
p=Q->front->next;
*x=p->data;
*y=p->password;
Q->front->next=p->next;
if(p->next==NULL)
Q->rear=Q->front;
free(p);
return 1;
}
}

void NumberOff(LinkQueue *Q,int reportValue,int personNumber,int *array)
{ /报数函数/
LinkListQ *p;
int x,y;
int count=1,j=0;
while(personNumber)
{
while(count!=reportValue)
{
DeQueue(Q,&x,&y);
InQueue(Q,x,y);
count++;
}
p=Q->front->next;
array[j++]=p->data;
reportValue=p->password;
DeQueue(Q,&x,&y);
count=1;
personNumber--;
}
}

int GetPersonNumber()
{ /输入处理的人数函数/
int personNumber;
printf("请输入人数:");
scanf("%d",&personNumber);
printf("本次求约瑟夫环的出列顺序人数为%d人。\n",personNumber);
return personNumber;
}

int GetPassword()
{ /给每个人赋密码函数/
int password;
static int num=1;
printf("请输入第%d个人的密码:",num);
scanf("%d",&password);
num++;
return password;
}

int main()
{
LinkQueue *Q;
int personNumber,reportValue,array[40],x,y;
printf("约瑟夫环问题:\n");
personNumber=GetPersonNumber();
printf("请输入密码的上限:");
scanf("%d",&reportValue);
Q=InitQueue();
for(int i=1; i<=personNumber; i++)
{
x=i;
y=GetPassword();
InQueue(Q,x,y);
}
NumberOff(Q,personNumber,reportValue,array);
printf("\n按照出列的顺序输出各人的编号:");
for(int k=0; k
{
printf("%-3d",array[k]);
}
printf("\n");
}

运行结果及报错内容

输出的结果是错误的,求高人指点