数据结构约瑟夫问题求解.docx

上传人:b****6 文档编号:8491254 上传时间:2023-01-31 格式:DOCX 页数:13 大小:16.58KB
下载 相关 举报
数据结构约瑟夫问题求解.docx_第1页
第1页 / 共13页
数据结构约瑟夫问题求解.docx_第2页
第2页 / 共13页
数据结构约瑟夫问题求解.docx_第3页
第3页 / 共13页
数据结构约瑟夫问题求解.docx_第4页
第4页 / 共13页
数据结构约瑟夫问题求解.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

数据结构约瑟夫问题求解.docx

《数据结构约瑟夫问题求解.docx》由会员分享,可在线阅读,更多相关《数据结构约瑟夫问题求解.docx(13页珍藏版)》请在冰豆网上搜索。

数据结构约瑟夫问题求解.docx

数据结构约瑟夫问题求解

 

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;

arrLista(n);

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*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;i

p=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;i

p=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;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 其它模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1