敢死队问题说明书Word文档下载推荐.docx

上传人:b****3 文档编号:16370207 上传时间:2022-11-23 格式:DOCX 页数:28 大小:125.53KB
下载 相关 举报
敢死队问题说明书Word文档下载推荐.docx_第1页
第1页 / 共28页
敢死队问题说明书Word文档下载推荐.docx_第2页
第2页 / 共28页
敢死队问题说明书Word文档下载推荐.docx_第3页
第3页 / 共28页
敢死队问题说明书Word文档下载推荐.docx_第4页
第4页 / 共28页
敢死队问题说明书Word文档下载推荐.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

敢死队问题说明书Word文档下载推荐.docx

《敢死队问题说明书Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《敢死队问题说明书Word文档下载推荐.docx(28页珍藏版)》请在冰豆网上搜索。

敢死队问题说明书Word文档下载推荐.docx

typedefstructlnode

{

intnum;

//战士编号

structlnode*next;

//指向下个结点的指针

}lnode;

//顺序表定义

typedefstructNList

{

intlength;

intmark[10];

}NList;

//循环队列定义

typedefstructCirQueue

intdata[QueueSize];

intfront;

//代表数组存放的第一个数据对应的下标,即对头

intrear;

//代表数组存放的最后一个数据对应的下标,对尾

intcount;

//计数器,记录队中元素总数

}CirQueue;

//函数声明

/////////////////////////////////////////////////开始菜单,版权声明

voiddisplay1();

////含有声明

voiddisplay2();

////选择菜单

voidclearline();

////清除多余的输入

/////////////////////////////////////////////////////循环队列函数声明

voidInitial(CirQueue*Q);

//初始化队列函数

intIsEmpty(CirQueue*Q);

//判断队是否为空

intIsFull(CirQueue*Q);

//判断队列是否为空

voidEnQueue(CirQueue*Q,intx);

//入队操作

intDeQueue(CirQueue*Q);

//删除操作

voidCirqueue(intnum,intCCC);

//队列方法处理数据

/////////////////////////////////////////////////////////////////////////

voidOne_way(intM,intCCC);

///////////////////////////单向循环链表算法

voidArray(intpeople,intCCC);

///////////////////////////////////数组算法

voidNlist(intnum,intCCC);

//////////////////////////////////////顺序表算法

2.各模块的伪码算法

(一)主函数

voidmain()

display1();

intchoice;

//菜单选择

//战士数目

while(cin>

>

choice)

{

if(choice<

1||choice>

4)

{

cout<

<

"

请选择正确的菜单:

"

;

continue;

}

if(choice==1||choice==3||choice==4)

cout<

请输入不超过"

<

QueueSize<

的战士数目(数字):

else

请输入战士数目(数字):

///////输入战士数目

while(!

(cin>

num))

{

cin.clear();

while(cin.get()!

='

\n'

cout<

请正确输入:

clearline();

while(num<

2)

if(num<

1)////////对输入的数目小于1,作出反应

{cout<

战士数目不能少于一人!

\n请重新输入:

cin>

num;

continue;

}

elseif(num==1)////////对输入战士数目为1的情况,作出反应

{

cout<

只有一个战士,别无选择!

};

switch(choice)///////////当输入大于1人时,根据选择的数据类型,进行处理

case1:

Nlist(num);

break;

case2:

One_way(num);

case3:

Cirqueue(num);

case4:

Array(num);

display2();

/////再次输出选择菜单

}

}

(二)循环队列方法

voidCirqueue(intnum,intCCC)

inti,start,count,j;

CirQueues;

for(start=1;

start<

=num;

start++)//start为测试起点

{

Initial(&

s);

//初始化队列

for(i=1;

i<

i++)//将所有士兵的编号依次进队

EnQueue(&

s,i);

};

for(i=1;

start;

i++)

{j=DeQueue(&

//删除队头结点

EnQueue(&

s,j);

//这两句是把队头的元素取出来然后放到队尾去,经过这个循环以后,要从那个开始的士兵的编号就会在队的队头位置了

};

count=0;

//删除结点数

while(count<

num-1)

for(i=1;

CCC;

{

j=DeQueue(&

EnQueue(&

//这两句是把队头的元素取出来然后放到对尾

//经过这个循环以后,队头的那个节点的值就是数到5对应的节点

j=DeQueue(&

//把这个节点出队,但是没有在把它放到队尾,就相当于把它删除了

count++;

//同第一个方法是一样,删除点数为m-1是结束循环

if(s.data[s.front]==1)break;

//此时队只剩一个点,如果是排长就输出

}

cout<

应从第:

位战士开始计数"

endl;

}

3.函数的调用关系图

4.调试分析

a、调试中遇到的问题及对问题的解决方法

说明:

(1)本程序运行的环境是VisualC++2010;

(2)程序运行后,显示的提示信息为选择使用数据类型的菜单,正确输入后,会依次出现提示输入战士数目,报数数字。

均正确输入后,即可输出相应的计算结果。

(3)调试

调试过程中,出现如下错误信息:

发现错误为:

“usingnamespacestd”指令只声明在main()内部。

改正为:

将“usingnamespacestd”指令声明为全局范围,即可正确运行。

b、算法的时间复杂度和空间复杂度

时间复杂度为:

T(n)=O(mn);

空间复杂度为:

S(n)=O(f(n));

5.测试结果

6.源程序(带注释)

#include<

iostream>

usingnamespacestd;

constintQueueSize=10;

////////////////////////////////////////////////////////////////////////

intmain()

intCCCC;

///报数数字

choice)////////////////对输入非菜单选项的数字作出反应

////////////////////////////输入战士数目

if(choice==1||choice==3||choice==4)/////当选择的数据结构中含有数组时,提示最大值

num))////////对输入进行检测并作出反应

//////////对输入如"

123abc"

的情况作出处理,清除结尾的字符

1)////////对输入的树木小于1,作出反应

请输入报数数字:

cin>

CCCC;

Nlist(num,CCCC);

One_way(num,CCCC);

Cirqueue(num,CCCC);

Array(num,CCCC);

////////////输出菜单,进行下一次测试

///////////////////////////////////////////////开始菜单和版权声明函数定义

voiddisplay1()

cout<

**************************************"

endl

<

*《敢死队》丁婷*"

*版权所有翻版必究*"

\n\n\n\n\n"

请选择数据类型:

1、顺序表2、单向循环链表3、循环队列4、数组Q、退出"

voiddisplay2()///////////////选择菜单

\n\n请选择数据类型:

voidclearline()////////清除当前行多余的部分

while(cin.get()!

continue;

/////////////////////////////////////////////////////////////循环队列方法

//初始化对令队为空

voidInitial(CirQueue*Q)

Q->

front=Q->

rear=0;

//对头等于对尾代表队列为空

//判队列是否为空

intIsEmpty(CirQueue*Q)

if(Q->

count==0)return1;

//如果队里的元素个数为0,队列空,返回1

elsereturn0;

//判队列是否满

intIsFull(CirQueue*Q)

count==QueueSize)return1;

//将元素进队

voidEnQueue(CirQueue*Q,intx)

if((Q->

rear+1)%QueueSize==Q->

front)

printf("

列满\n"

);

exit

(1);

};

///如果堆满就退出程序

count++;

//否则就进入,元素总数加一

data[Q->

rear]=x;

//数组的最后一位赋值为x

rear=(Q->

rear+1)%QueueSize;

//重新设置队尾指针

//元素出队列

intDeQueue(CirQueue*Q)

inttemp;

if(IsEmpty(Q))

队列为空\n"

//下溢,退出运行

temp=Q->

front];

//将队头的元素取出到temp里面

count--;

//队列元素个数减1

front=(Q->

front+1)%QueueSize;

//循环意义下的头指针后移(即数组中第一个元素存放的位置的下标加1)

returntemp;

///////////////////方法

inti,start,count,j;

Initial(&

j=DeQueue(&

//这两句是把队头的元素取出来然后放到队尾去,经过这个循环以后,要从那个开始的士兵的编号就会在队的队头位置

count=0;

while(count<

if(s.data[s.front]==1)break;

/////////////////////////////////////////////////////////单向循环链表方法

voidOne_way(intM,intCCC)

//M为士兵个数

inti;

intstart,count;

lnode*l;

=M;

start++)//start表示从哪个士兵开始数

//初始化链表

lnode*p=newlnode;

//分配空间

l=p;

//l为始终指向第一个节点的指针

l->

num=1;

//第一个节点代表的士兵编号赋值为1,至此第一个节点创建完毕

for(i=2;

=M-1;

lnode*q=newlnode;

q->

num=i;

p->

next=q;

//创建其他节点,并将它接到链表尾部

p=q;

//把指针p移后一位,使他指向刚链上的节点,也就是当前的最后一个节点

}

lnode*t=newlnode;

//从这里开始创建最后一个节点

t->

num=M;

//节点编号为M

p->

next=t;

//连上去

p=t;

next=l;

//并将最后一个节点与第一个节点相连,变成循环链表

//找到起点

p=l;

//P指向第一个节点

p=p->

next;

//一个一个往下找,一直到找到编号为start的那个节点,从这里开始计数

count=0;

//删除的节点的个数

M-1)

t=p;

p=t->

};

//数到5就停下

t->

next=p->

//将该节点删除

//删除结点的个数加1

p=t->

//从下一个节点开始继续数

}//当删除的节点为M-1个时,就结束

if(p->

num==1)

break;

//此时表里面应该只有一个节点了,判断节点的编号是不是等于1,也就是是不是代表排长,如果是就结束循环

//将从哪里开始的那个士兵编号输出来

}///////////////////////////////////数组算法///////////////////////////////////数组算法

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

当前位置:首页 > 党团工作 > 入党转正申请

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

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