任意约瑟夫环

/*

任务:

一群小孩围成一圈,任意假定一个数m,从第一个小孩起,顺时针方向数,每数到第m个小孩时,该小孩便离开。

小孩不断离开,圈子不断缩小。最后剩下的一个小孩便是胜者。求胜者的编号?

要求

以面向对象技术进行程序设计

建立环状链表类

程序便于维护与扩张:如易于对小孩数量n和数数间隔m进行变化

改变获胜者数量,使其可设为任意值

可中途增加小孩人数

*/

//类的实现

#include<iostream>

using namespace std;

typedef int ElemType;

typedef struct List

{

         ElemType data;

         struct List *next;

}LinkNode,*LinkList;

class Huan

{

public:

         void setNumber();

         void creat_List();

         void insert();

         void deal();

private:

         int number;

         int number1;

         int winnum;

         LinkList real;

};

void Huan::setNumber()

{

         cout<<"请输入有多少人:"<<endl;

         cin>>number;

         cout<<"请输入一个数表示数到该数时有人退出:"<<endl;

         cin>>number1;

         cout<<"请输入赢家人数:"<<endl;

         cin>>winnum;

}

void Huan::creat_List()

{

         LinkList first=new LinkNode;

         first->data=-1;

         LinkList p=first;

         if(first==NULL)

         {

                   cout<<"分配内存失败"<<endl;

                   exit(0);

         }

         cout<<"请输入相应数据"<<endl;

         for(int i=0;i<number;i++)

         {

                   p->next=new LinkNode;

                   cin>>p->next->data;

                   p=p->next;

         }

         p->next=first;

         real=p;//把头结点赋给real

}

void Huan::insert()

{

         LinkList p=real;

         cout<<"还剩下"<<number<<"个人.请输入在"<<real->data<<"后面的第几个位置"<<endl;

         int i;

         cin>>i;

         while(true)

         {

                   if(i>number||i<1)

                   {

                            cout<<"输入数据有误,请重新输入"<<endl;

                            cin>>i;

                   }

                   else

                            break;

         }

         if(p->data==-1)

                   p=p->next;

         for(int j=1;j<i;)//找结点到前驱

         {

                   if(p->data!=-1)

                   {

                            p=p->next;

                            j++;

                   }

                   if(p->data==-1)

                            p=p->next;

         }

         LinkList l=new LinkNode;

         cout<<"请输入这个人的号码:"<<endl;

         cin>>l->data;

        

         l->next=p->next;

         p->next=l;

         number++;

}

 

void Huan::deal()

{

         int tag=0;char choice;int peopleNum;

         LinkNode *p,*load;

         while(number>winnum)//real为删除指定点的前驱

         {

                   if(real->next->data==-1)

                   {

                            real=real->next;

                            continue;

                   }

                   else

                   {

                            tag++;

                            if(tag==number1)

                            {

                                     p=real->next;

                                     real->next=real->next->next;

                                     delete p;

                                     number--;

                                     cout<<"剩余人数的数据为"<<endl;

                                     load=real;

                                     int con=0;

                                     while(con<number)

                                     {

                                               if(load->data==-1)

                                                        load=load->next;

                                               else

                                               {

                                                        cout<<load->data<<'\t';

                                                        load=load->next;

                                                        con++;

                                               }

                                     }

                                     cout<<endl;

                                    

                                     cout<<"是否有人插入(Y),人数的个数"<<endl;

                                     cin>>choice>>peopleNum;

                                     if(choice=='Y')

                                     {

                                               for(int k=0;k<peopleNum;k++)

                                               {

                                                        insert();

                                                        cout<<"剩余人数的数据为"<<endl;

                                                        load=real;

                                                        int con=0;

                                                        while(con<number)

                                                        {

                                                                 if(load->data==-1)

                                                                           load=load->next;

                                                                 else

                                                                 {

                                                                           cout<<load->data<<'\t';

                                                                           load=load->next;

                                                                           con++;

                                                                 }

                                                        }

                                                        cout<<endl;

                                               }

                                              

                                     }

                                     tag=0;

                                     continue;

                            }

                           

                            real=real->next;      

                   }

         }

         cout<<"赢家的数据为:"<<endl;

         int times=0;

         while(times<winnum)

         {

                   if(real->data!=-1)

                   {

                           

                            cout<<real->data<<'\t';

                            times++;

                   }

                   real=real->next;

         }

         cout<<endl;

}

void main()

{

         Huan xin;

         xin.setNumber();

         xin.creat_List();

         xin.deal();

}

posted @ 2012-11-22 23:09  ♂咱說 ろ算  阅读(272)  评论(0编辑  收藏  举报