一群猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1——m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,然后继续从1开始,这样依次下来,直到圈中只剩下一只猴子,则该猴子为大王。
我这里有一个程序(不过不是很完善D):
///////////////////////////头文件////////////////
typedef struct member
{
    int ID;//某个人的序号
    int cipher;//密码
    member *next;//下一个
    
}Person;
typedef struct
{
    Person *head;//链表头
    Person *tail;//链表尾
    int lenth;//链表长
}List;
///////////// 算法部分 ( .cpp 文件)////////////
//添加链表元素
void AddMember(List &list,int ID,int cipher)
{
    Person *per = (Person *)malloc(sizeof(Person));
    per->ID = ID;
    per->cipher = cipher;
    //当链表为空时
    if(list.lenth == 0)
    {
        list.head = per;
        list.tail = per;
        per->next = list.head;
    }
    else //当链表不空时
    {
        per->next = list.head;
        list.tail->next = per;
        list.tail = per;
    }
    list.lenth++;
}
//用来记录输出结果的数组 初始化
void InitArray(int lenth, int **array)
{
    *array = (int *)malloc(lenth * sizeof(int));
}
//处理链表(排序)
void DoList(List list, int *array)
{
 int N = list.lenth;//用于循环
 int arrayCount = 0;//输出数组的下标
 int cip; 
 Person *person = list.head;
  cip = person->cipher;
 while(N > 0)
 {
     for(int i = 1; i < cip; i++)//找出下一个出列的人
         person = person->next;
     
      Person *p = person->next;
      cip = p->cipher;
      array[arrayCount] = p->ID;
      arrayCount++;
      person->next = p->next;
      free(p);
      N--;      
 }
   
}
//////////////main 函数部分(.cpp 文件)/////////////
#include <iostream.h>
#include <malloc.h>
#include <stdlib.h>
#include "test2.h"
#include "algo2.cpp"
void main()
{
    int max, n;
    int cipher;
    List list;
    char loop;//循环的标志
  do
  { 
      cout<<"*************** 约瑟夫环问题 ****************"<<endl<<endl;
      do
      {
            cout<<"输入密码的最大值: ";
            cin>>max;
            cout<<endl<<"输入人数: ";
            cin>>n;
            if(max <= 0 || n <= 0)
                cout<<"你所输入的数不能小于 1,请重新输入"<<endl;
      }
      while(max <= 0 || n <= 0);
      list.lenth = 0;
      
      for(int i = 1; i <= n; i++)
      {
          cout<<"输入第 "<<i<<" 个人的密码(必须大于0): ";
          do
          {
            cin>>cipher;
            if(cipher > max)
                cout<<"你所输入的数大于密码的最大值,请从新输入:"<<endl;
            if(cipher <= 0)
                cout<<"你所输入的数小于 1,请从新输入:"<<endl;
          }
          while(cipher > max || cipher <= 0);
          AddMember(list, i, cipher);//添加成员
      }
      int *array;
      InitArray(n, &array);//数组初始化
DoList(list, array);//按顺序删除成员
      cout<<endl<<"************* 出列顺序为 ***************"<<endl;
      for(i = 1; i <= n; i++)//输出出列顺序
      {
          if(i%20 == 0)
              cout<<endl;
          cout<<array[i-1]<<" ";
      }
      cout<<endl<<"是否要继续?(Y / N)"<<endl;
      cin>>loop;
      system("cls");//清屏幕 
  }
  while(loop == 'Y' || loop == 'y');
}

