Josephus.h
class Josephus
{
public:
void OutControl(int num,int begin,int interval);
protected:
int num;
int begin;
int interval;
};
List.h
struct People
{
int number;
People *next;
};
class List
{
public:
List (int num)//初始化point->number
{
josephus = new People[num];
point = josephus;
for(int i=1;i<=num;i++)
{
point->number = i ;
point->next = josephus + i % num; /*利用+1取模的方式設(shè)置節(jié)點(diǎn)的next指針,
當(dāng)?shù)阶詈蟮臅r(shí)候自動(dòng)指向到第一個(gè),形成環(huán)鏈 */
point = point->next;
}
point = &josephus[num-1]; //把起始指針設(shè)置在最后一個(gè)節(jié)點(diǎn),當(dāng)進(jìn)入循環(huán)的時(shí)候就會(huì)從0開始,
}
~List()
{
delete[] josephus; //返回堆內(nèi)存空間
}
void Change (int num, int begin);
void Count(int interval);
void Output();
void Show();
protected:
People *josephus;
People *point;
People *cut_point;
};
Josephus.cpp
#include
#include "Josephus.h"
#include "List.h"
using namespace std;
void Josephus::OutControl(int num,int begin,int interval) //調(diào)用List的成員函數(shù),依次輸出出列的號(hào)碼
{
List in(num);
in.Change (num, begin);
cout<<"依次出列次序?yàn)?";
for(int i=1;i<=num;i++)
{
in.Count(interval);
in.Show();
in.Output();
}
cout< }
List.cpp
#include
#include "List.h"
using namespace std;
void List::Change (int num, int begin) //設(shè)置起始指針的位置
{
if (begin==1)
point=&josephus[num-1];
if (begin>=2)
point=&josephus[begin-2];
}
void List::Count(int interval) //通過循環(huán)不斷的尋找需要放棄的節(jié)點(diǎn)
{
for(int i=0;i {
cut_point = point;
point = cut_point->next;
}
}
void List::Show() //打印號(hào)碼
{
cout<number<<".";
}
void List::Output() //使不需要的節(jié)點(diǎn)脫離
{
cut_point->next = point->next;
point=cut_point;
}
main.cpp
#include
#include "Josephus.h"
using namespace std;
void main()
{ int num,begin,interval;
cout<<"請輸入總?cè)藬?shù):";
cin>>num;
if(num<2)
{
cout<<"錯(cuò)誤!總?cè)藬?shù)不能小于2!";
return;
}
cout<<"請輸入開始號(hào)碼:";
cin>>begin;
if(begin<1||begin>num)
{
cout<<"錯(cuò)誤!開始號(hào)碼不能小于1或大于總?cè)藬?shù)!";
return;
}
cout<<"請輸入間隔:";
cin>>interval;
if(interval<1||interval>num)
{
cout<<"錯(cuò)誤!間隔不能小于1或大于總?cè)藬?shù)!";
return;
}
Josephus in;
in.OutControl(num,begin,interval);
cin.get ();
cin.get ();
}
class Josephus
{
public:
void OutControl(int num,int begin,int interval);
protected:
int num;
int begin;
int interval;
};
List.h
struct People
{
int number;
People *next;
};
class List
{
public:
List (int num)//初始化point->number
{
josephus = new People[num];
point = josephus;
for(int i=1;i<=num;i++)
{
point->number = i ;
point->next = josephus + i % num; /*利用+1取模的方式設(shè)置節(jié)點(diǎn)的next指針,
當(dāng)?shù)阶詈蟮臅r(shí)候自動(dòng)指向到第一個(gè),形成環(huán)鏈 */
point = point->next;
}
point = &josephus[num-1]; //把起始指針設(shè)置在最后一個(gè)節(jié)點(diǎn),當(dāng)進(jìn)入循環(huán)的時(shí)候就會(huì)從0開始,
}
~List()
{
delete[] josephus; //返回堆內(nèi)存空間
}
void Change (int num, int begin);
void Count(int interval);
void Output();
void Show();
protected:
People *josephus;
People *point;
People *cut_point;
};
Josephus.cpp
#include
#include "Josephus.h"
#include "List.h"
using namespace std;
void Josephus::OutControl(int num,int begin,int interval) //調(diào)用List的成員函數(shù),依次輸出出列的號(hào)碼
{
List in(num);
in.Change (num, begin);
cout<<"依次出列次序?yàn)?";
for(int i=1;i<=num;i++)
{
in.Count(interval);
in.Show();
in.Output();
}
cout<
List.cpp
#include
#include "List.h"
using namespace std;
void List::Change (int num, int begin) //設(shè)置起始指針的位置
{
if (begin==1)
point=&josephus[num-1];
if (begin>=2)
point=&josephus[begin-2];
}
void List::Count(int interval) //通過循環(huán)不斷的尋找需要放棄的節(jié)點(diǎn)
{
for(int i=0;i
cut_point = point;
point = cut_point->next;
}
}
void List::Show() //打印號(hào)碼
{
cout<
}
void List::Output() //使不需要的節(jié)點(diǎn)脫離
{
cut_point->next = point->next;
point=cut_point;
}
main.cpp
#include
#include "Josephus.h"
using namespace std;
void main()
{ int num,begin,interval;
cout<<"請輸入總?cè)藬?shù):";
cin>>num;
if(num<2)
{
cout<<"錯(cuò)誤!總?cè)藬?shù)不能小于2!";
return;
}
cout<<"請輸入開始號(hào)碼:";
cin>>begin;
if(begin<1||begin>num)
{
cout<<"錯(cuò)誤!開始號(hào)碼不能小于1或大于總?cè)藬?shù)!";
return;
}
cout<<"請輸入間隔:";
cin>>interval;
if(interval<1||interval>num)
{
cout<<"錯(cuò)誤!間隔不能小于1或大于總?cè)藬?shù)!";
return;
}
Josephus in;
in.OutControl(num,begin,interval);
cin.get ();
cin.get ();
}