可控制人数及删除编号的约瑟夫环

#include <iostream>
using namespace std;
#define NULL 0
struct Link
{
 int data;
 Link *next;
};
class LinkList
{
public:
    LinkList(){}
 ~LinkList(){}
 int n;
 int m;
    int detal;//新增小孩人数
 Link *p;
 Link *head;//指向头指针
 Link h;//头结点
 void set();
 void GreatLinkList();//构造循环链表
 void ChoseNumOflast();
};
void LinkList::set()
{
 char c;
 cout<<"请输入人数n:"<<endl;
 cin>>n;
 cout<<"请输入淘汰的编号m:"<<endl;
 cin>>m;
 cout<<"你是否想增加小孩人数(1.想(Y)  2.不想(N))"<<endl;
 cin>>c;
 if(c=='Y')
 {
  cout<<"请输入新增的小孩人数:"<<endl;
    cin>>detal;
 }
 else
  detal=0;
}
void LinkList::GreatLinkList()
{
 h.next=NULL;
 head=&h;
 p=head;
 for(int i=1;i<=(n+detal);i++)
 {
  p->next=new Link;
  p=p->next;
  p->data=i;      
  if(i!=(n+detal))
  {
   p->next=NULL;
  }
  else
  {
   p->next=head->next;
  }
 }
}
void LinkList::ChoseNumOflast()
{
 int num=0;//循环的次数
 int k;
 cout<<"请输入获胜者的人数:"<<endl;
 cin>>k;
 cout<<endl;
 p=head;
 p=p->next;
/* int n2=0;
 int sun=0;
 do
 { 
  p=p->next;
  n2++;
 }while(n2<n-1);

 int n1=0;
 do{
  if(n1%k==0)
  {
   p->next=p->next->next;
   n1++;
   sun++;
  }
  else
  {
   p=p->next;
   n1++;
  }
 }while(sun<n-1);
 cout<<p->data<<endl;*/
  // while(p!=p->next)
  // {
 for(int n1=0;n1<k;n1++)
 {
    for(int i=1;i<=m-2;i++)
   {
     p=p->next;
   }
   p->next=p->next->next;
   p=p->next;
   cout<<"胜利的人的编号为:"<<endl;
      cout<<p->data<<endl;
 }
}

void main()
{
 LinkList L1[3];
 for(int i=1;i<=3;i++)
 {
   L1[i].set();
   L1[i].GreatLinkList();
     L1[i].ChoseNumOflast();
   cout<<"-------------------------------------------"<<endl;
 }
}


 

posted on 2012-12-20 22:29  木本  阅读(144)  评论(0编辑  收藏  举报

导航