约瑟夫环问题 
[问题描述] 
编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第b个人开始顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。设计一个程序来求出出列顺序。 

利用顺序存储结构模拟此过程,按照出列的顺序输出各个人的编号。


#include <iostream.h>
typedef struct list{//创建链表结构 list;
                    
                     int data;//数据域;
                     struct list *next;//指针域;
                    }list; 
void  main()
{   
    list *head, *p,*q;//head为头结点,辅助结点p和q;
    int n,m,b,i,x,j;
    cout<<"设置n,b和m的值:  "<<endl;//链表长度为:n;从第b个位置开始报数;报m出列;
    cin>>n>>b>>m;
    q=new list;//给新创建的q结点开辟存储空间;
    head=q;//q指向头结点;
    cout<<"输入n个整型值:"<<endl;
    for(i=1;i<=n;i++)
    {//创建长度为n 的链表;
       cin>>x;
       p=new list;//生成新结点;
       p->data=x; //给新结点赋值;
       p->next=NULL;//另新结点的指针域指向空;
       q->next=p;//q结点重新指向尾结点p;
       q=p;
     }//创建链表完成;
    q->next=head->next;
    for(i=1;i<b;i++)  head=head->next;//找到单循环链表中的第b 个结点作为循环链表的新结点;
    p=head;//p指向头结点;
    cout<<"输出序列依次为: "<<endl;
    for(i=1;i<=n;i++)
    {
      for(j=1;j<m;j++)     p=p->next;//找到新的头结点后的第(m-1)个结点;
      q=p->next;//q指向第m个结点;此时p指向q;
      cout<<q->data<<"  ";
      p->next=q->next;//注意变化:此时p指向q的下一个结点;
      delete q;//q结点没用了,删掉!单循环链表结点个数少一个;
    }
    return ;
}  


此帖转自:[url]http://www.programfan.com/team/team.asp?team_id=1346[/url]