数据结构约瑟夫问题求解.docx
《数据结构约瑟夫问题求解.docx》由会员分享,可在线阅读,更多相关《数据结构约瑟夫问题求解.docx(13页珍藏版)》请在冰豆网上搜索。
数据结构约瑟夫问题求解
Josephus问题求解
13070319
张乐
2015.3.19
顺序表
1、需求分析
明确规定:
输入形式、输入值的范围:
输入整数形式的数字,范围大于等于1
输出形式;一行输出一个数字
程序功能;模拟约瑟夫问题求解过程
测试数据(包括正确的输入和输出、错误的输入和输出)
9个人,从第5个人开始报数,数到3的人出列。
输出结果为:
7、1、4、8、3、9、6、2、5
测试结果截图为:
1、概要设计
ADT定义:
template
classarrList{
private:
T*aList;
intmaxSize;
intcurLen;
intposition;
public:
arrList(constintsize){
maxSize=size;
aList=newT[maxSize];
curLen=position=0;
}
~arrList(){
delete[]aList;
}
voidclear(){
curLen=position=0;
}
intlength();
boolappend(constTvalue);
booldeletea(constintp);
boolgetValue(constintp,T&value);
intgetcurLen();
};
2、详细设计
实现ADT定义的数据类型:
template
intarrList:
:
length(){
returncurLen;
}
template
boolarrList:
:
append(constTvalue){
aList[curLen]=value;
curLen++;
position++;
}
template
boolarrList:
:
deletea(constintp){
inti;
if(curLen<=0){
cout<<"Noelementtodelete\n"<returnfalse;
}
if(p<0||p>curLen-1){
cout<<"deletionisillegal!
\n"<returnfalse;
}
for(i=p;iaList[i]=aList[i+1];
curLen--;
returntrue;
}
template
boolarrList:
:
getValue(constintp,T&value){
value=aList[p];
}
算法描述:
算法的关键在于每次要出列的人的标号该如何获得,采用的算法是起始报数的人的标号加上需出列人所报的数,然互对总人数取余,输出删除即可。
3、调试分析
调试中遇到的问题、如何解决、对设计与实现的分析讨论;
在调试的过程中,遇到了返回当前所在位置无意写错的问题,导致始终无法产生正确结果,(本该返回curLen,结果由于自己手误写为maxSize),后来经过改正,得到了正确的结果。
算法时空分析;
3、用户使用说明
(1)首先按照运行界面的提示输入。
(2)每次输入之后按enter键。
(3)最后得出您想要的结果。
4、测试结果
测试输入:
9、3、5
测试结果:
7、1、4、8、3、9、6、2、5
5、源程序
#include
usingnamespacestd;
template
classarrList{
private:
T*aList;
intmaxSize;
intcurLen;
intposition;
public:
arrList(constintsize){
maxSize=size;
aList=newT[maxSize];
curLen=position=0;
}
~arrList(){
delete[]aList;
}
voidclear(){
curLen=position=0;
}
intlength();
boolappend(constTvalue);
booldeletea(constintp);
boolgetValue(constintp,T&value);
intgetcurLen();
};
template
intarrList:
:
length(){
returncurLen;
}
template
boolarrList:
:
append(constTvalue){
aList[curLen]=value;
curLen++;
position++;
}
template
boolarrList:
:
deletea(constintp){
inti;
if(curLen<=0){
cout<<"Noelementtodelete\n"<returnfalse;
}
if(p<0||p>curLen-1){
cout<<"deletionisillegal!
\n"<returnfalse;
}
for(i=p;iaList[i]=aList[i+1];
curLen--;
returntrue;
}
template
boolarrList:
:
getValue(constintp,T&value){
value=aList[p];
}
intmain(){
intm,n,s,i,value,inte=1;
cout<<"请您输入总人数n"<cin>>n;
arrLista(n);
for(i=0;ia.append(i+1);
}
cout<<"当前每个人的标号为:
"<for(i=0;ia.getValue(i,value);
cout<}
cout<<"请您指定出列数字m:
"<cin>>m;
cout<<"请您指定从第几个人开始报数:
"<cin>>s;
cout<<"输出出列人的序号:
"<i=s-1;
for(;inte<=n;inte++){
i=(i+m-1)%(a.length());
a.getValue(i,value);
cout<a.deletea(i);
}
}
链表:
ADT定义:
template
classLink{
public:
Tdata;
Link*next;
Link(Tinfo,Link*nextValue=NULL){
data=info;
next=nextValue;
}
Link(Link*nextValue){
next=nextValue;
}
};
template
classInkList
{
private:
Link*head,*tail;
public:
InkList();//构造函数
~InkList();//析构函数
boolappend(constTvalue);//在表尾追加值为value的元素
voidJosephus(int,int,int);
};
ADT实现:
template
InkList:
:
InkList()//构造函数的实现
{
head=tail=NULL;
}
template
InkList:
:
~InkList()//析构函数
{
Link*tmp;
while(head!
=NULL){
tmp=head;
head=head->next;
deletetmp;
}
}
template
boolInkList:
:
append(constTvalue)
{
if(head==NULL){
head=newLink(value,NULL);
tail=head;
}
else
{
tail->next=newLink(value,NULL);
tail=tail->next;
}
returntrue;
}
template
voidInkList:
:
Josephus(intn,ints,intm)
{
inti,j;
Link*p,*q;
for(i=1;i<=n;i++)
append(i);
tail->next=head;
p=head;
while(p->data!
=(p->next)->data)
{
while(p->data!
=s)
p=p->next;
if(m==1)
{
for(i=1;i<=n;i++)
{
cout<data<p=p->next;
}
cout<return;
}
else{
for(i=1;ip=p->next;
q=p->next;
cout<data<s=(q->next)->data;
p->next=q->next;
deleteq;
}
}
cout<data<}
链表的程序源码如下:
#include
usingnamespacestd;
template
classLink{
public:
Tdata;
Link*next;
Link(Tinfo,Link*nextValue=NULL){
data=info;
next=nextValue;
}
Link(Link*nextValue){
next=nextValue;
}
};
template
classInkList
{
private:
Link*head,*tail;
public:
InkList();//构造函数
~InkList();//析构函数
boolappend(constTvalue);//在表尾追加值为value的元素
voidJosephus(int,int,int);
};
template
InkList:
:
InkList()//构造函数的实现
{
head=tail=NULL;
}
template
InkList:
:
~InkList()//析构函数
{
Link*tmp;
while(head!
=NULL){
tmp=head;
head=head->next;
deletetmp;
}
}
template
boolInkList:
:
append(constTvalue)
{
if(head==NULL){
head=newLink(value,NULL);
tail=head;
}
else
{
tail->next=newLink(value,NULL);
tail=tail->next;
}
returntrue;
}
template
voidInkList:
:
Josephus(intn,ints,intm)
{
inti,j;
Link*p,*q;
for(i=1;i<=n;i++)
append(i);
tail->next=head;
p=head;
if(m==1)
{
for(i=1;i<=n;i++)
{
cout<data<p=p->next;
}
cout<return;
}
else
while(p->data!
=(p->next)->data){
while(p->data!
=s)
p=p->next;
for(i=1;ip=p->next;
q=p->next;
cout<data<s=(q->next)->data;
p->next=q->next;
deleteq;
}
cout<data<}
intmain()
{
intn,s,m;
cout<<"输入排列的总人数n的值:
"<cin>>n;
cout<<"输入起始报数人号码s的值:
"<cin>>s;
cout<<"输入数到m出列的m的值:
"<cin>>m;
InkLista;
cout<<"出列顺序:
"<a.Josephus(n,s,m);
a.~InkList();
return0;
}