约瑟夫双向生死者游戏,怎么用学号姓名来命名这些旅客,并且输出死亡和活着旅客的学号姓名

#include
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()
{
data = 0;
prior = NULL;
next = NULL;
}

//

Doublelist::Doublelist()
{
Head = NULL;
}

//

void Doublelist::Creatlist(Doublelist &L)
{
cout << "请输入双向生死游戏的总人数N:";
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:";
 int s;
 cin >> s;
 
 cout << "请输入正向的死亡数字M:";
 int m;
 cin >> m;
 
 cout << "请输入逆向的死亡数字W:";
 int w;
 cin >> w;
 
 cout << "请输入剩余的生者人数";
 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()
{
cout << "现有N人围成一圈,从第S个人开始依次报数,正向报M的人出局,再由下一人开始报数,";
cout << "逆时针数到的第W人出局。再从他逆时针的下一个人数起,顺时针数M人。";
cout << "如此循环,直到剩下K个乘客为止。"<< '\n' << '\n';

DoubleJoseph();

system("pause");
return 0;

}

img


这样?


#include<iostream>
#include<string>
using namespace std;

//

class Node
{
friend class Doublelist;
friend void DoubleJoseph();

  public:
         Node();
         int data;
         string name;
         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()
{
data = 0;
prior = NULL;
next = NULL;
}

//

Doublelist::Doublelist()
{
Head = NULL;
}

//

void Doublelist::Creatlist(Doublelist &L)
{
cout << "请输入双向生死游戏的总人数N:";
int n;
cin >> n;
Node *p,*s;

for(int i = 1;i <= n;i++)
{
p = new Node;
p->data = i;
cout<<"请输入"<<i<<"编号人的姓名";
cin>>p->name;
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:";
 int s;
 cin >> s;

 cout << "请输入正向的死亡数字M:";
 int m;
 cin >> m;

 cout << "请输入逆向的死亡数字W:";
 int w;
 cin >> w;

 cout << "请输入剩余的生者人数";
 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 <<r->name<< '\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 <<"--"<<r->name<<endl;
          t++;
      }
 }
 cout << '\n' << "最后剩下:" << '\t' <<L.getLength(L) << "人" << endl;
 cout << "剩余的生者位置为:" << '\t';
 p = L.Head;

 while(p->next != L.Head)
 {
               cout << p->data<<"--" <<p->name<<'\t';
               p = p->next;
 }
 if(p)
 cout << p->data <<"--"<<p->name<< '\t';
 cout << '\n';
}
//

int main()
{
cout << "现有N人围成一圈,从第S个人开始依次报数,正向报M的人出局,再由下一人开始报数,";
cout << "逆时针数到的第W人出局。再从他逆时针的下一个人数起,顺时针数M人。";
cout << "如此循环,直到剩下K个乘客为止。"<< '\n' << '\n';

DoubleJoseph();

system("pause");
return 0;
}