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

来源:互联网 发布:seo网站推广招聘 编辑:程序博客网 时间:2024/05/19 19:33
#include<iostream>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; }
0 0
原创粉丝点击