用循环队列解决约瑟夫环问题

int deQueue(SqQueue &sq,ElemType &x) //出队元素 x
{
    SqQueue sq1;
    int i=1;
    int k,m;
    scanf("%d",&k);//进队元素个数
    scanf("%d",&m);
    while(sq1.rear!=sq1.front)//判断循环条件  队不空时循环
    {
        if (i%m!=0)
            i++;
    else //即i%m=0
    {
        sq1.front=(sq1.front+1) % MaxSize; //队头循环进 1
    x=sq1.data[sq1.front];
    i=1;//出队之后重置i=1
    }

    }
    return 1;
}

void expand_action()
{
    ElemType t;
    SqQueue sq1;
    InitQueue(sq1);
    EnQueue(sq1,'h');
        EnQueue(sq1,'i');
            EnQueue(sq1,'j');
                EnQueue(sq1,'k');
                    EnQueue(sq1,'l');
                        EnQueue(sq1,'m');    //元素进队
                        while(!QueueEmpty(sq1)) //队不空循环
                        {
                            deQueue(sq1,t); //出队元素 e
                            printf("%c ",t); //输出元素 e
                        }
                        printf("\n销毁队列\n");
                        DestroyQueue(sq1);

}
以上是我的代码片 有很多地方想不太明白

img

他的思路有点不懂 为什么没到m值的人要出队呢 不应该是数到m出 然后重置i值继续循环吗?