实验三队列实验报告docx.docx
《实验三队列实验报告docx.docx》由会员分享,可在线阅读,更多相关《实验三队列实验报告docx.docx(20页珍藏版)》请在冰豆网上搜索。
实验三队列实验报告docx
合肥禽配
HEFEIUNIVERSITY
计算机科学与技术系
实验报告
专业名称计算机科学与技术
课程名称数据结构与算法
项目名称实验三队列实验
班级
学号
姓名
同组人员无
实验日期
实验三队列实验
实验题目:
建立含有若干个元素的循环队列和链队列,并分别实现循环队列和链队列的入队和出对操作。
(1)先实现循环队列的入队和出队操作
1•问题分析
本程序要求实现建立含有若干个元素的循环队列,并实现循环队列的入队和出队操作。
完成该实验需要以下4个子任务:
砂义一个循环队列的存储结构,定义队列的基本算法。
②定义一个display()函数实现队列元素的输出看入队是否成功
④在主函数中完成操作
测试数据设计如下:
12345
6
2.概要设计
为了实现上述程序功能,需要:
②声明一个循环队列②定义出队列的基本算法,
②通过键盘输入5个整数,入队,出队②在主函数中先往队列里输入5个元素,然后入队,输出,看入队是否成功,然后出队,再调用display()函
数看是否出队。
1)本程序包含7个函数:
1主函数main()
2.置空队:
InitQueue()
3.判对空:
QUeUeEmPtyo
4.判队满:
QUeUeFUll()
5.入队:
AddO
6.出队:
DeIeteO
7.display()
各函数关系如下:
InitQueue()
QueueEmptyO
QueueFuI1()
Add()Main
DeIete()display()
3、详细设计
实现概要设计中定义的所有的数据类型,对每个操作给出了算法和代码,主程序和模块都需要代码。
(1)循环队列
#definemaxlen10
typedefStrUCt{
intdata[maxlen];
intfront;intrear;
}SeqQueue;
(2)队列基本算法
SeqQUeUe*lnitQueue(SeqQueue*q)//建立一个空循环队列
{
q=(SeqQueue*)malloc(sizeof(SeqQueue));
q->front=0;
q->rear=0;
returnq;
}
intQueueFull(SeqQUeUe*q){//判断队列是否为满
if(q->front==(q->rear+1)%maxlen)
return1;
elsereturn0;
}
intQueueEmpty(SeqQueue*q){
if(q->rear==q->front)
return1;
elsereturn0;
}
voidAdd(SeqQueue*q,intx)//
{
if(!
QueueFull(q)){
q->rear=(q->rear+1)%maxlen;q->data[q->rear]=x;
}elseprintf("queuefull");
}
voidDelete(SeqQueue*q){//
if(!
QueueEmpty(q))q->front=(q->front+1)%maxlen;
elseprintf("queueEmpty");
}
(3)用display()函数输出循环队列元素
voiddisplay(SeqQueue*q)
{
inti;
if(q->front!
=q->rear)
{
printf("输出循环队列元素:
");
i=q->front;
do
{
i=(i+1)%maxlen;
printf("%d",q->data[i]);}while(i!
=q->rear);
}
else
printf("队列为空!
");
}
//判断队列是否为空
入队
出队
//输出循环队列q的元素
//循环队列非空,输出队列元素
(4)在主函数中先往队列里输入5个元素,输出,看入队是否成功,然后出队,再调用display()函数看是否出队。
intmain()
{
SeqQueue*q;
//建立空循环队列
//入队5个元素
//输出循环队列元素
//把5个元素出队
//再入队一个元素
//再输出循环队列元素
inti,y;
q=lnitQueue(q);
Printf("请输入5个元素");
for(i=0;i<5;i++)
{
SCanf("%d",&y);
Add(q,y);
}display(q);for(i=0;i<5;i++)
{
DeIete(q);
}
Printf("\n请输入1个元素");SCanf("%d",&y);
Add(q,y);
display(q);return0;
}
4、调试分析
编译无错误
5、用户使用说明
程序名为class1.exe,在DEBUGt件夹里面。
运行环境ViSUaIC++6.0。
6、测试结果
请输入吕个元素12345
⅛i由循环罠列元素:
12345
请⅛λl÷7E⅛6
输出循环队列元索:
6PressanykeytoCOntinUe
7、附录
#include
#include
#definemaxlen10
typedefstruct{
intdata[maxlen];
intfront;
intrear;
}SeqQueue;
SeqQueue*InitQueue(SeqQueue*q)//建立一个空循环队列{
q=(SeqQueue*)malloc(sizeof(SeqQueue));
q->front=0;
q->rear=0;
returnq;
}
intQueueFull(SeqQueue*q){//判断队列是否为满
if(q->front==(q->rear+1)%maxlen)return1;
elsereturn0;
}
intQueueEmpty(SeqQueue*q){
if(q->rear==q->front)
return1;
elsereturn0;
}
voidAdd(SeqQueue*q,intx)
{
if(!
QueueFull(q)){q->rear=(q->rear+1)%maxlen;q->data[q->rear]=x;
}elseprintf("queuefull");
}
voidDelete(SeqQueue*q){
if(!
QueueEmpty(q))q->front=(q->front+1)%maxlen;
elseprintf("queueEmpty");
}
voiddisplay(SeqQueue*q)
{
inti;
//判断队列是否为空
//入队
//出队
//输出循环队列q的元素
//循环队列非空,输出队列元素
if(q->front!
=q->rear)
printf("输出循环队列元素:
");i=q->front;
do
{
i=(i+1)%maxlen;printf("%d",q->data[i]);
}while(i!
=q->rear);
}
else
printf("队列为空!
");
}
intmain()
{
SeqQueue*q;
inti,y;
q=InitQueue(q);
printf("请输入5个元素");
for(i=0;i<5;i++)
{
scanf("%d",&y);
Add(q,y);
}
display(q);
for(i=0;i<5;i++)
{
Delete(q);
}
printf("\n请输入1个元素");scanf("%d",&y);
Add(q,y);display(q);return0;
//建立空循环队列
//入队5个元素
//输出循环队列元素
//把5个元素出队
//再入队一个元素
//再输出循环队列元素
(2)实现链队列的入队和出队操作
1.问题分析
本程序要求实现建立含有若干个元素的链队列,并实现链队列入队和出队操作
完成该实验需要以下4个子任务:
(1定义一个链队列的存储结构,定义链队列的基本算法。
②定义一个display()函数实现队列元素的输出看入队是否成功
14在主函数中完成操作
测试数据设计如下:
12345
6
2.概要设计
为了实现上述程序功能,需要:
11声明一个链队列12定义出链队列的基本算法,
13通过键盘输入5个整数,入队,出队14在主函数中先往队列里输入5个元素,然后入队,输出,看入队是否成功,然后出队,再调用display()函数看是否出队。
2)本程序包含6个函数:
1主函数main()
2.置空队:
InitQueue()
3.判对空:
QueueEmpty()
4.入队:
Addo
5.出队:
DeIeteo
6.display()
各函数关系如下:
SetQueue()
QueueEmptyO
Add()
DeIete()
display()
4、详细设计
实现概要设计中定义的所有的数据类型,对每个操作给出了算法和代码,主程序和模块都需要代码。
(1)链队列
#definemaxlen10
typedefStrUCtnode{
intdata;
StrUCtnode*next;
}LinkList;
typedefStrUCt{
LinkList*front,*rear;
}LinkQueue;
LinkQueue*q;
(2)队列基本算法
LinkQueue*SetQueue()//建立一个空链队列
{
q=(LinkQueue*)malloc(sizeof(LinkQueue));
q->front=(LinkList*)malloc(sizeof(LinkList));
q->front->next=NULL;
q->rear=q->front;
returnq;
}
intQueueEmpty(LinkQueue*q){if(q->rear==q->front)
return1;
elsereturn0;
}
//判断队列是否为空
LinkQueue*Add(LinkQueue*q,intx)
{
LinkList*p;
p=(LinkList*)malloc(sizeof(LinkList));
p->data=x;p->next=NULL;
q->rear->next=p;
q->rear=p;
returnq;
}
LinkQueue*Delete(LinkQueue*q){
LinkList*p;
if(!
QueueEmpty(q)){p=q->front->next;
q->front->next=p->next;if(p->next=NULL)q->rear=q->front;free(p);returnq;
}
elseprintf("queueEmpty");
}
(3)用display()函数输出链队列元素voiddisplay(LinkQueue*q)
{
LinkList*p;
p=q->front->next;
if(p!
=NULL)
{
printf("输出链队元素");
while(p!
=NULL)
{printf("%2d",p->data);p=p->next;
}
}
elseprintf("\n链队为空");
//入队
//出队
//输出链队列的元素
然后出队,
//建立空链队列
//入队5个元素
//把5个元素出队
//看是否出队成功
}
(4)在主函数中先往队列里输入5个元素,输出,看入队是否成功,再调用display()函数看是否出队。
intmain()
{
inti,y=O;
SetQueue();
display(q);
Printf("∖n请输入5个元素");
for(i=0;i<5;i++)
{
SCanf("%d",&y);
Add(q,y);
}
display(q);for(i=0;i<5;i++)
{
DeIete(q);
}
display(q);
return0;
}
4、调试分析
编译无错误
5、用户使用说明
程序名为class12exe,在DEBUGt件夹里面。
运行环境ViSUaIC++6.0。
6、测试结果
链队为穹
诸输入5个元索12345
输陆元壷12345
麓队为⅞PressanykeytoCOntinlle
7、附录
#include
#include
#definemaxlen10typedefstructnode{intdata;structnode*next;
}LinkList;
typedefstruct{
LinkList*front,*rear;
}LinkQueue;
LinkQueue*q;
LinkQueue*SetQueue()//建立一个空链队列
{q=(LinkQueue*)malloc(sizeof(LinkQueue));q->front=(LinkList*)malloc(sizeof(LinkList));q->front->next=NULL;
q->rear=q->front;returnq;
}
intQueueEmpty(LinkQueue*q){//判断队列是否为空if(q->rear==q->front)
return1;
elsereturn0;
}
LinkQueue*Add(LinkQueue*q,intx)//入队
{
LinkList*p;p=(LinkList*)malloc(sizeof(LinkList));p->data=x;p->next=NULL;q->rear->next=p;
q->rear=p;returnq;
}
LinkQueue*Delete(LinkQueue*q){//出队
LinkList*p;
if(!
QueueEmpty(q)){p=q->front->next;q->front->next=p->next;if(p->next=NULL)q->rear=q->front;
}
elseprintf("queueEmpty");
}
voiddisplay(LinkQueue*q)
{
LinkList*p;
p=q->front->next;
if(p!
=NULL)
{
printf("输出链队元素");while(p!
=NULL)
{
printf("%2d",p->data);p=p->next;
}
}
elseprintf("\n链队为空");
}
intmain()
{
inti,y=0;
SetQueue();
display(q);
printf("\n请输入5个元素");
for(i=0;i<5;i++)
{
scanf("%d",&y);
Add(q,y);
}
display(q);
for(i=0;i<5;i++)
{
Delete(q);
}
display(q);
return0;
//输出链队列的元素
//建立链队列
//入队5个元素
//把5个元素出队
//看是否出队成功
实验题目2:
写出下列程序段的输出结果,并通过程序运行来验证1•问题分析
完成该实验需要以下4个子任务:
(£定义一个循环队列的存储结构,定义队列的基本算法。
②定义一个Print()函数实现程序
④在主函数中完成操作
测试数据设计如下:
2.概要设计
为了实现上述程序功能,需要:
②声明一个循环队列②定义出队列的基本算法,
②在主函数调用print()函数看是否出队。
3)本程序包含8个函数:
1主函数main()
2.置空队:
InitQueue()
3.判对空:
QUeUeEmPtyo
4.判队满:
QUeUeFUll()
5.入队:
AddO
6.出队:
DeIeteO
7.display()
8.GetHeado
各函数关系如下:
GetHead()
InitQueue()
QueueEmptyO
QueueFuI1()
Add()Main
DeIete()
Print()
5、详细设计
实现概要设计中定义的所有的数据类型,对每个操作给出了算法和代码,主程序和模块都需要代码。
(1)循环队列
#definemaxlen10
typedefStrUCt{
Chardata[maxlen];
intfront;intrear;
}SeqQueue;
(2)队列基本算法
SeqQUeUe*lnitQueue(SeqQueue*q)//建立一个空循环队列
{
q=(SeqQueue*)malloc(sizeof(SeqQueue));
q->front=0;
q->rear=0;
returnq;
}
intQueueFull(SeqQUeUe*q){//判断队列是否为满
if(q->front==(q->rear+1)%maxlen)
return1;
elsereturn0;
}
intQUeUeEmPty(SeqQUeUe*q){//判断队列是否为空
if(q->rear==q->front)
return1;
elsereturn0;
}
charGetHead(SeqQueue*q){//
if(!
QueueEmpty(q))
returnq->data[(q->front+1)%maxlen];
elseprintf("queueEmpty");
}
voidAdd(SeqQueue*q,charx)//
{
if(!
QueueFull(q)){q->rear=(q->rear+1)%maxlen;q->data[q->rear]=x;
}elseprintf("queuefull");
}
voidDelete(SeqQueue*q){//
if(!
QueueEmpty(q))q->front=(q->front+1)%maxlen;
elseprintf("queueEmpty");
}
(3)用print()函数验证程序
voidprint(SeqQueue*q)
{
charx,y,t;
x='e';y='c';
Add(q,'h');
Add(q,'r');
Add(q,y);
x=GetHead(q);
Delete(q);
Add(q,x);
x=GetHead(q);
Delete(q);
Add(q,'a');
while(QueueEmpty(q)==0){y=GetHead(q);Delete(q);printf("%c",y);
}
printf("%c",x);
取栈顶元素
入队
出队
(4)在主函数中调用Print()函数验证程序
intmain()
{
SeqQueue*q;q=lnitQueue(q);Print(q);
return0;
}
4、调试分析
编译无错误
5、用户使用说明
程序名为CIaSS2.exe,在DEBUGt件夹里面。
运行环境ViSUaIC++6.0。
6、测试结果
I■ILZ・VL∙∣JV^-3i2L⅜⅝-∣U£_XLZJkJU弓⅜⅝uIlJIJ4£_・JKJ
charPressanykeytoCOntinue
7、附录
#includeVStdiO.h>
#includeVStdIib.h>
#definemaxlen10typedefStrUCt{
Chardata[maxlen];
intfront;
intrear;
}SeqQueue;
//建立一个空循环队列
SeqQUeUe*lnitQueue(SeqQueue*q)
q=(SeqQueue*)malloc(sizeof(SeqQueue));
q->front=0;
q->rear=0;
returnq;
}
intQueueFull(SeqQueue*q){
if(q->front==(q->rear+1)%maxlen)return1;
elsereturn0;
}
//判断队列是否为满
intQueueEmpty(SeqQueue*q){if(q->rear==q->front)return1;
elsereturn0;
}
charGetHead(SeqQueue*q){
if(!
QueueEmpty(q))
//判断队列是否为空
//取栈顶元素
returnq->data[(q->front+1)%maxlen];elseprintf("queueEmpty");
}
voidAdd(SeqQueue*q,charx)//入队{
if(!
QueueFull(q)){q->rear=(q->rear+1)%maxlen;q->data[q->rear]=x;
}elseprintf("queuefull");
}
voidDelete(SeqQueue*q){//出队if(!
QueueEmpty(q))q->front=(q->front+1)%maxlen;
elseprintf("queueEmpty");
}
voidprint(SeqQueue*q){
charx,y,t;x='e';y='c';Add(q,'h');Add(q,'r');
Add(q,y);
x=GetHead(q);
Delete(q);
Add(q,x);
x=GetHead(q);
Delete(q);
Add(q,'a');
while(QueueEmpty(q)==0){y=GetHead(q);Delete(q);printf("%c",y);
}
printf("%c",x);
}
int