user-0 提问: 求助！约瑟夫环的问题

回复:
user: user-1
content: 仅供参考：//假设有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(); }

user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

user: user-2
content: C++自定义链表实现约瑟夫环（上） http://blog.csdn.net/hou09tian/article/details/78220636 C++自定义链表实现约瑟夫环（下） http://blog.csdn.net/hou09tian/article/details/78256196 希望能帮到你

user: user-3
content: #include<stdio.h> #include<stdlib.h>  //创建结构体 typedef struct Node {     int Num;//编号     int pass;//密码     struct Node *next; }Node,*PNode,*HNode;  int JoseInsert(Node *h, int pos/*创建第几个人*/, int x/*每个人的密码*/); int JoseInit(HNode h); void TraverseNode(HNode h, int M/*参与人数*/); int JoseDelete(HNode &h, int M/*参与人数*/, int &k/*出局密码*/);    //初始化链表 int JoseInit(HNode h) {     if (!h)     {         printf("链表初始化错误!\n");         return 0;     }     h->next = h;     return 1; } //单链表插入工作 int JoseInsert(Node **h, int pos/*创建第几个人*/,int x/*每个人的编号*/) {     int pa;     PNode p = *h, q;     int i = 1;     scanf("%d", &pa);     if (pos == 1)     {         p->Num = x;         p->pass = pa;         p->next = p;         return 1;     }     while (i < pos-1)     {         p = p->next;         i++;     }     q = (PNode)malloc(sizeof(Node));     q->Num = x;     q->pass = pa; /* p to q */     q->next = p->next;     p->next = q;      return 1; }  //遍历 void TraverseNode(HNode h, int M/*参与人数*/) {     int i = 0;     PNode p = h;     printf("参与的人的编号为\n");     while (i < M )     {          printf("%d\t", p->Num);         p = p->next;         i++;     }      p = h;     i = 0;     printf("\n参与的人的密码为\n");     while (i < M)     {         printf("%d\t", p->pass);         p = p->next;         i++;     }     printf("\n"); } //出局 int JoseDelete(HNode &h, int M/*参与人数*/, int &k/*出局密码*/) {     int i;     PNode p = h, q;     while (M > 1)     {         for (i = 1; i < k - 1; i++)         {             p = p->next;         }         q = p->next;         p->next = q->next;         printf("出局的人为：%d号\n", q->Num);         printf("密码变更为：%d\n", q->pass);         k = q->pass;         free(q);         p = p->next;         M--;     }     return 1; }    int main() {     int i;//计数器     int N;//参与人数     int k;//密码     printf("请输入初始密码\n");     scanf("%d", &k);     printf("请输入参与人数\n");     scanf("%d", &N);     HNode h = (HNode)malloc(sizeof(Node));//头节点     JoseInit(h);//初始化     for (i = 1; i <= N; i++) /* delete ;*/     {         JoseInsert(&h, i, i);//插入法创建链表     }     TraverseNode(h,N);//遍历链表     if (k)         JoseDelete(h, N, k);//进行游戏     return 0; } 代码中问题做了修改； 目前发现约瑟夫环的执行逻辑还是有点问题，比如初始密码为1，那么就会先删除头节点，这种情况没有考虑到吧 建议在这个基础上继续完善你的功能；