13个人围成一圈,从第一个人开始顺序报号1,2,3,要求用链表处理

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

13个人围成一圈,从第一个人开始顺序报号1,2,3,要求用链表处理

用代码块功能插入代码,请勿粘贴截图
#pragma warning(disable : 4996) 
#include
#include
#define N 13


typedef struct People
{
    int num;
    struct People* next;
}human;


int main()
{
    int i;
    human* p;
    human person[N];          //13个人
    for (i = 0; i < N; i++)
    {
        person[i].num = i + 1;
        if (i == 12)
        {
            person[i].next = person;     //首尾地址相连
        }
        else
        {
            person[i].next = person[i + 1].next;   //前面地址指向后面的地址
        }
    }
    for (i = 0, p = person; p->next != p; p = p->next)   //从第一个人开始;循环结束条件:p的指针域不能存放自身(即最后一个留在圈子里的人);p指向下一个结点
    {
        i++;
        if (i % 2 == 0)    //此时p[i]是报数报到2的人,例如:第一个报到2的人是p[1],依次类推
        {
            p->next = p->next->next;    //此时p的下一个结点 指向 p的下下一个结点,例如:若第一个报到2的人是p[1],则p的指针域存放着下下个结点(p[3])的地址,也就是&p[1]指向p[3],跳过了p[2]
            i = 0;
        }
    }
    printf("The last one to stay in the circle:%d", p->num);
    return 0;
}
    

运行结果及报错内容

引发了异常: 读取访问权限冲突。
p 是 0x7。