在m只猴子聚在一起选大王,大家围成一圈, 按顺时针从1编号, 第一次从编号为1的开始报数, 以后循环进行, 当报到n时退出圈子, 下一只则重新从1开始报数, 圈子中剩下的最后一只猴子则为大王.

问题遇到的现象和发生背景
问题相关代码,请勿粘贴截图
运行结果及报错内容
我的解答思路和尝试过的方法

为什么这个代码运行错误

我想要达到的结果
#include<iostream>
using namespace std;
struct node {
    int date;
    node* next = NULL;
};
int main()
{
    int T; int m[100], n[100];
    cin >> T;
    for (int i = 0; i < T; i++)
    {
        cin >> m[i] >> n[i];
    }
    for (int i = 0; i < T; i++)
    {
        node* p, * f, * t;
        t = new node;
        t->date = 1;
        p = t;
        for (int j = 2; j <= m[i]; j++)
        {

            f = new node;
            p->next = f;
            p = f;
            p->date = j;

        }
        p->next = t;
        for (int h = 0; h < m[i] - 1; h++)
        {
            for (int s = 1; s < n[i]; s++) t = t->next;//t yekaishibianhuale
            t->next = t->next->next;
        }
        if (n[i] == 1)cout << m[i]<<endl;
        else
        cout << t->date << endl;
    }
}

仅供参考:

//假设有n个人团团围做,从第1个人开始数数,数到第m个人时候,第m个人出列,
//然后继续从1开始数数,数到第m个人退出
#include <stdio.h>
#include <conio.h>
int i,k,t;
int n,m;
static char f[1001];//0该座位未出圈,1该座位已出圈
void main() {
    while (1) {
        printf("Input n m(1000>=n>=m>=1):");
        fflush(stdout);
        rewind(stdin);
        if (2==scanf("%d%d",&n,&m)) {
            if (1000>=n && n>=m && m>=1) break;
        }
    }
    t=0;//已出圈总人数
    i=1;//座位编号
    k=1;//当前要数的数
    while (1) {
        if (0==f[i]) {
            if (m==k) {
                t++;
                f[i]=1;
                printf("%3d ",i);
                if (0==t%10) printf("\n");
                if (t>=n) break;
            }
            k++;if (k>m) k=1;
        }
        i++;if (i>n) i=1;
    }
    cprintf("Press any key ...");
    getch();
}