用双循环链表解决约瑟夫问题

来源:互联网 发布:2015全国意外事故数据 编辑:程序博客网 时间:2024/06/04 20:14

约瑟夫问题:犹太历史学家约瑟夫他在自己的日记中写道,他和他的40个战友被罗马军队包围在洞中。他们讨论是自杀还是被俘,最终决定自杀。41个人站成一个圆圈,从第一个人开始数数,每次数到3,则该人自杀;然后下个人又从1开始数,然后数到3的人再自杀,依此下去...

单循环链表示意图:


说明:单循环链表可以要头结点也可以不要头结点

代码如下:

#include <iostream>using namespace std;typedef struct node{    int data;    struct node *next;}Node, *pNode;pNode CreateCircleLink(int n);       //创建一个有n个元素的循环链表,返回值为该链表的第一个节点的地址int GetNodeNumber(pNode first);      //获取循环链表的节点个数int main(){    int n = 41;  //约瑟夫问题中的人数,在本例中使用41    int m = 3;  //约瑟夫问题中每隔几个人自杀一个,本例中取3    int num = n; //循环链表中剩余的节点个数    int i = 1;    pNode p = CreateCircleLink(n);  //p指向循环链表的第一个元素    while(num >= m)   //当总人数小于m时,结束    {        while(i < m - 1)        {            p = p->next;            i++;        }        cout << p->next->data << "->";        pNode temp = p->next;        p->next = temp->next;        delete temp;        p = p->next;        num = GetNodeNumber(p);        i = 1;    }    num = GetNodeNumber(p);    while(num > 1)    {        cout << p->data << "->";        p = p->next;        num--;    }    cout << p->data;    return 0;}pNode CreateCircleLink(int n)       //创建一个有n个元素的循环链表{    pNode pHead = new Node;    pNode p = pHead;    pNode pNew;    for(int i=0; i<41; i++)    {        pNew = new Node;        pNew->data = i + 1;        p->next = pNew;        p = pNew;    }    pNew->next = pHead->next;    delete pHead;    return pNew->next;}int GetNodeNumber(pNode first)         //获取循环链表剩余节点的个数{    int num = 1;    pNode p = first;    while(p->next != first)    {        p = p->next;        num++;    }    return num;}
运行结果:



0 0
原创粉丝点击