课程设计源代码

 
 
/******************************************************
版权所有(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;
}

运行结果:

课程设计源代码_第1张图片

你可能感兴趣的:(课程设计源代码)