数据结构(三):循环单链表解决约瑟夫问题

#include
using namespace std;

 //小孩结点类型
 struct Child{
 int no;        //小孩编号 
 Child* next;   //指针域,指向下一个指针
};

//设计运算算法
class Joseph
{
    int n, m;
    Child *h;       //首结点指针 

public:
    Joseph(int n1, int m1)  //构造函数, 建立有n1歌结点的循环单链表 
    {
        int i ;         
        Child *p, *r;       //r指向新建链表的尾结点 
        n = n1;     
        m = m1;
        h = new Child();
        h->no = 1;          //先建立只有一个no为1 的结点的单链表 
        r = h;
        for(i = 2; i <= n; i++)
        {
            p = new Child();//建立一个新结点 
            p->no = i;      //新结点存放编号i 
            r->next = p;    //将*p结点链接到末尾 
            r = p;          //构成一个首结点为h的循环单链表 
        }
        r->next = h;
    }

    ~Joseph()              //析构函数, 所有结点在出列时已释放 
    {}

    void Jsequence()        //求约瑟夫序列 
    {
        int i , j;
        Child*p, *q;
        for(i = 1; i <= n; i++)//共出列n个孩子 
        {
            p = h; 
            j = 1;
            while(j < m-1)  //从*h结点开始报数, 报到第m-1个节点 
            {
                j++;        //报数递增 
                p = p->next;//移到下一个结点 
            }
            q = p->next;    //q指向第m个结点 
            cout << q->no << " ";//该节点的小孩出列 
            p->next = q->next;   //删除*q结点 
            delete q;           //释放其空间 
            h = p->next;        //从下一个结点从新开始 
        }
    }
 }; 


 int main()
 {
    int n = 6;
    int m = 5;
    Joseph obj(n,m);
    cout << "n = " << n << " , m = " << m <<  " 的约瑟夫序列:";
    obj.Jsequence();
    cout << endl; 
    return 0;
 }

你可能感兴趣的:(C++)