数据结构约瑟夫问题求解.docx
- 文档编号:8491254
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:13
- 大小:16.58KB
数据结构约瑟夫问题求解.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;i aList[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;i aList[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; arrList for(i=0;i a.append(i+1); } cout<<"当前每个人的标号为: "< for(i=0;i a.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 Link(Tinfo,Link data=info; next=nextValue; } Link(Link next=nextValue; } }; template classInkList { private: Link public: InkList();//构造函数 ~InkList();//析构函数 boolappend(constTvalue);//在表尾追加值为value的元素 voidJosephus(int,int,int); }; ADT实现: template InkList : InkList()//构造函数的实现 { head=tail=NULL; } template InkList : ~InkList()//析构函数 { Link while(head! =NULL){ tmp=head; head=head->next; deletetmp; } } template boolInkList : append(constTvalue) { if(head==NULL){ head=newLink tail=head; } else { tail->next=newLink tail=tail->next; } returntrue; } template voidInkList : Josephus(intn,ints,intm) { inti,j; Link 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< p=p->next; } cout< return; } else{ for(i=1;i p=p->next; q=p->next; cout< s=(q->next)->data; p->next=q->next; deleteq; } } cout< } 链表的程序源码如下: #include usingnamespacestd; template classLink{ public: Tdata; Link Link(Tinfo,Link data=info; next=nextValue; } Link(Link next=nextValue; } }; template classInkList { private: Link public: InkList();//构造函数 ~InkList();//析构函数 boolappend(constTvalue);//在表尾追加值为value的元素 voidJosephus(int,int,int); }; template InkList : InkList()//构造函数的实现 { head=tail=NULL; } template InkList : ~InkList()//析构函数 { Link while(head! =NULL){ tmp=head; head=head->next; deletetmp; } } template boolInkList : append(constTvalue) { if(head==NULL){ head=newLink tail=head; } else { tail->next=newLink tail=tail->next; } returntrue; } template voidInkList : Josephus(intn,ints,intm) { inti,j; Link for(i=1;i<=n;i++) append(i); tail->next=head; p=head; if(m==1) { for(i=1;i<=n;i++) { cout< p=p->next; } cout< return; } else while(p->data! =(p->next)->data){ while(p->data! =s) p=p->next; for(i=1;i p=p->next; q=p->next; cout< s=(q->next)->data; p->next=q->next; deleteq; } cout< } intmain() { intn,s,m; cout<<"输入排列的总人数n的值: "< cin>>n; cout<<"输入起始报数人号码s的值: "< cin>>s; cout<<"输入数到m出列的m的值: "< cin>>m; InkList cout<<"出列顺序: "< a.Josephus(n,s,m); a.~InkList(); return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 约瑟夫 问题 求解