课程设计源代码

来源:互联网 发布:淘宝密码忘了 编辑:程序博客网 时间:2024/04/20 11:33
/******************************************************版权所有(C++)2015,杜佳丽文件名称:约瑟夫.c作者:杜佳丽完成日期:20141225*******************************************************/#include<iostream>#include<cstdlib>using namespace std;class Node//双向循环链表的结点类{    friend class Doublelist;    friend void DoubleJoseph();public:    Node();    int data;    Node *prior;    Node *next;private:};class Doublelist//双向循环链表类{    friend void DoubleJoseph();public:    void Creatlist(Doublelist &L);//建立双向循环链表    int getLength(Doublelist &L);//获得链表长度    Doublelist();private:    Node *Head;};Node::Node()//Node类的构造函数,初始化首结点数据{    data=0;    prior=NULL;    next=NULL;}Doublelist::Doublelist()//Doublelist类的构造函数,初始化首结点数据{    Head=NULL;}void Doublelist::Creatlist(Doublelist &L)//建立双向循环链表{    cout<<"请输入双向生死游戏的总人数N:"<<'\t';    int n;    cin>>n;    Node *p,*s;    for(int i=1;i<=n;i++)    {        p=new Node;        p->data=i;        p->next= NULL;        if(i==1)        {            L.Head=p;            p->prior=NULL;            s=L.Head;        }        else        {            s->next=p;            p->prior=s;            s=s->next;        }    }    s->next=L.Head;    L.Head->prior=p;}int Doublelist::getLength(Doublelist &L)//获取双向链表的长度{    Node *p=L.Head;    int count=0;    while(p->next!=L.Head)    {        count++;        p=p->next;    }    count++;    return count;}void DoubleJoseph()//实现约瑟夫双向生死游戏{    Doublelist L;    L.Creatlist(L);    cout<<"请输入游戏开始的位置S:"<<'\t';    int s;    cin>>s;    cout<<"请输入正向的死亡数字M:"<<'\t';    int m;    cin >> m;    cout<<"请输入逆向的死亡数字W:"<<'\t';    int w;    cin>>w;    cout<<"请输入剩余的生者人数K:"<<'\t';    int k;    cin>>k;    cout<<endl;    Node *p,*q,*r;    p=L.Head;    for(int i=0;i<s-1;i++)    {        p=p->next;    }    int t=1;    while(k<L.getLength(L))    {        if(t%2)//选择游戏方式        {            //报数,寻找m结点            for(int j=0;j<m-1;j++)            {                q=p;                p=p->next;            }            //元素出列            if(p==L.Head)            {                r=p;                L.Head=p->next;                q->next=p->next;                p->next->prior=q;                p=p->next;            }            else            {                r=p;                q->next=p->next;                p->next->prior=q;                p=p->next;            }            cout<<"第" <<t<<"个死者的位置是:"<<r->data<<'\n';            t++;        }        else        {            for(int j=0;j<w - 1;j++)                //报数,选择w结点            {                q=p;                p=p->prior;            }            //元素出列            if(p==L.Head)            {                r=p;                L.Head=p->prior;                q->prior=p->prior;                p->prior->next=q;/******************************************************版权所有(C++)2015,杜佳丽文件名称:约瑟夫.c作者:杜佳丽完成日期:20141225*******************************************************/#include<iostream>#include<cstdlib>using namespace std;class Node//双向循环链表的结点类{    friend class Doublelist;    friend void DoubleJoseph();public:    Node();    int data;    Node *prior;    Node *next;private:};class Doublelist//双向循环链表类{    friend void DoubleJoseph();public:    void Creatlist(Doublelist &L);//建立双向循环链表    int getLength(Doublelist &L);//获得链表长度    Doublelist();private:    Node *Head;};Node::Node()//Node类的构造函数,初始化首结点数据{    data=0;    prior=NULL;    next=NULL;}Doublelist::Doublelist()//Doublelist类的构造函数,初始化首结点数据{    Head=NULL;}void Doublelist::Creatlist(Doublelist &L)//建立双向循环链表{    cout<<"请输入双向生死游戏的总人数N:"<<'\t';    int n;    cin>>n;    Node *p,*s;    for(int i=1;i<=n;i++)    {        p=new Node;        p->data=i;        p->next= NULL;        if(i==1)        {            L.Head=p;            p->prior=NULL;            s=L.Head;        }        else        {            s->next=p;            p->prior=s;            s=s->next;        }    }    s->next=L.Head;    L.Head->prior=p;}int Doublelist::getLength(Doublelist &L)//获取双向链表的长度{    Node *p=L.Head;    int count=0;    while(p->next!=L.Head)    {        count++;        p=p->next;    }    count++;    return count;}void DoubleJoseph()//实现约瑟夫双向生死游戏{    Doublelist L;    L.Creatlist(L);    cout<<"请输入游戏开始的位置S:"<<'\t';    int s;    cin>>s;    cout<<"请输入正向的死亡数字M:"<<'\t';    int m;    cin >> m;    cout<<"请输入逆向的死亡数字W:"<<'\t';    int w;    cin>>w;    cout<<"请输入剩余的生者人数:"<<'\t';    int k;    cin>>k;    cout<<endl;    Node *p,*q,*r;    p=L.Head;    for(int i=0;i<s-1;i++)    {        p=p->next;    }    int t=1;    while(k<L.getLength(L))    {        if(t%2)//选择游戏方式        {            //报数,寻找m结点            for(int j=0;j<m-1;j++)            {                q=p;                p=p->next;            }            //元素出列            if(p==L.Head)            {                r=p;                L.Head=p->next;                q->next=p->next;                p->next->prior=q;                p=p->next;            }            else            {                r=p;                q->next=p->next;                p->next->prior=q;                p=p->next;            }            cout<<"第" <<t<<"个死者的位置是:"<<r->data<<'\n';            t++;        }        else        {            for(int j=0;j<w - 1;j++)                //报数,选择w结点            {                q=p;                p=p->prior;            }            //元素出列            if(p==L.Head)            {                r=p;                L.Head=p->prior;                q->prior=p->prior;                p->prior->next=q;                p=p->prior;            }            else            {                r=p;                q->prior=p->prior;                p->prior->next=q;                p=p->prior;            }            cout<<"第"<<t<<"个死者的位置是:"<<r->data<<endl;            t++;        }    }    cout <<'\n'<< "最后剩下:"<<'\t'<<L.getLength(L)<<"人"<<endl;    cout <<"剩余的生者位置为:"<<'\t';    p=L.Head;    while(p->next!=L.Head)    {        cout<<p->data<<'\t';        p=p->next;    }    if(p)        cout<<p->data<<'\t';    cout<<'\n';}int main()//主函数,调用DoubleJoseph()函数{    cout<<"现有N人围成一圈,从第S个人开始依次报数,正向报M的人出局,再由下一人开始报数,";    cout<<"逆时针数到的第W人出局。再从他逆时针的下一个人数起,顺时针数M人。";    cout<<"如此循环,直到剩下K个乘客为止。"<< '\n' << '\n';    DoubleJoseph();    system("pause");    return 0;}                p=p->prior;            }            else            {                r=p;                q->prior=p->prior;                p->prior->next=q;                p=p->prior;            }            cout<<"第"<<t<<"个死者的位置是:"<<r->data<<endl;            t++;        }    }    cout <<'\n'<< "最后剩下:"<<'\t'<<L.getLength(L)<<"人"<<endl;    cout <<"剩余的生者位置为:"<<'\t';    p=L.Head;    while(p->next!=L.Head)    {        cout<<p->data<<'\t';        p=p->next;    }    if(p)        cout<<p->data<<'\t';    cout<<'\n';}int main()//主函数,调用DoubleJoseph()函数{    cout<<"现有N人围成一圈,从第S个人开始依次报数,正向报M的人出局,再由下一人开始报数,";    cout<<"逆时针数到的第W人出局。再从他逆时针的下一个人数起,顺时针数M人。";    cout<<"如此循环,直到剩下K个乘客为止。"<< '\n' << '\n';    DoubleJoseph();    system("pause");    return 0;}

运行结果:


0 0