数据结构-单向循环链表-约瑟夫环-调试时出现Program received signal SIGSEGV

c语言实现单向循环链表求解约瑟夫环问题
题目如下

img

代码如下:

#include<stdio.h>

//数据结构实验课:实验一,约瑟夫环(必做题) 
//日期:2020.11.01

//链表初始化 
typedef struct circle_list               
    {
        int data;
        int num;
        struct circle_list *next;
    }list;

//创建节点 
list *creat_node()
{
    list *newnode=(list*)malloc(sizeof(struct circle_list));
    if(newnode==NULL)
    {
        printf("出错了!创建节点失败!\n");
    }
    else
    {
        newnode->next=NULL;
        return newnode;
    }
}

//数据写入 
int insert_list(list *head,int i)
{
    //创建节点
    int v;
    scanf("%d",&v);
    list *newnode=creat_node();
    newnode->data=v;
    newnode->num=i;
    //判断头结点是否为空
    if(head!=NULL)
    {
        
        //遍历头节点,中间变量P
        list *p  = head;
        //遍历头节点到,最后一个数据
        while(p->next != head )
        {
            p = p->next;
        }
        //把最后一个节点赋新的节点过去
        p->next = newnode;
        newnode->next = head;
        return 1;
    }
    else
    {
        printf("头结点为空");
        return 0;
    }
}

int main()
{
    //创建头节点
    list *head = creat_node();
    head->next = head;
    int m,n,i=0,j,a[100];
    scanf("%d %d",&m,&n);
    
    //链表初始化 
    for(i=1;i<=n;i++)
    {
        insert_list(head,i);
    }
    
    //至此,链表创建完毕 
    
    list *p = head;                //p指向头结点 
    list *q;
    i=1;
    
    while(head->next != head)
    {
        if(p->next==head)
        {
            p->next=head->next;
            i-=1;
        }
        else
        {
            p=p->next;
        }
        //头指针不存数据,因此跳过头指针 
        
        if(i==m-1)
        {
            q=p->next;
            m=q->data;                 //m的值更新 
            printf("%d ",q->num);
            p->next=q->next;           //q指向下一个结点 
            free(q);
            i=1;
        }
        else
        {
            p=p->next;
            i++;
        }
        
    }
    
    return 0;
}

运行时结果不对,会多输出一位数字,而且在输出完6,1,5,2之后,要等很久才会输出后面的数字

img

就算调试,也会出现下面这种错误

img