资源描述
数据结构实验报告
----试验三 循环队列得基本操作及应用
一、 问题描述:
熟悉并掌握循环队列得相关操作,自己设计程序,实现循环队列得构造、清空、销毁及队列元素得插入与删除等相关操作、
二、 数据结构设计:
#define MAXQSIZE 10 //最大队列长度
struct SqQueue
{
ﻩ QElemType *base; //初始化动态分配存储空间
ﻩ Int front; // 头指针,若队列不空,只想对列头元素
ﻩ int rear; //尾指针,若队列不空,指向队列尾元素得
//下一个位置
};
三、功能设计:
程序中所涉及到得函数如下:
Status InitQueue(SqQueue &Q) //构造一个空队列Q
Status DestroyQueue(SqQueue &Q) //销毁队列Q,Q不再存在
Status ClearQueue(SqQueue &Q) //将Q清为空队列
Status QueueEmpty(SqQueue Q) //若队列Q为空队列,则
//返回TRUE,否则返回FALSE
int QueueLength(SqQueue Q) //返回Q得元素个数,即队列长度
Status GetHead(SqQueue Q,QElemType &e)//若队列不空,则用e返回Q得对
//头元素,并返回OK,否则返回ERROR
Status EnQueue(SqQueue &Q,QElemType e)//插入元素e为Q得新得队尾元素
Status DeQueue(SqQueue &Q,QElemType &e)//若队列不空,则删除Q得队头
//元素,用e返回其值,并返回
//OK,否则返回ERROR
Status QueueTraverse(SqQueue Q,void(*vi)(QElemType))//从队头到队尾依次
//对队列Q中每个元素调用函数
//vi()、一旦vi失败,则操作失败
四、源程序:
// c1。h (程序名)
#include<string、h>
#include<ctype.h>
#include〈malloc。h> // malloc()等
#include〈limits.h> // INT_MAX等
#include<stdio.h〉 // EOF(=^Z或F6),NULL
#include<stdlib.h> // atoi()
#include<io、h〉 // eof()
#include<math.h> // floor(),ceil(),abs()
#include〈process、h> // exit()
#include<iostream、h> // cout,cin
// 函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE —1
// #define OVERFLOW -2 因为在math.h中已定义OVERFLOW得值为3,故去掉此
//行
typedef int Status; // Status就是函数得类型,其值就是函数结果状态代码,如OK等
typedef int Boolean; // Boolean就是布尔类型,其值就是TRUE或FALSE
// c3—3.h
#define MAXQSIZE 10
struct SqQueue
{
ﻩQElemType *base;
int front;
ﻩint rear;
};
#include"c1、h”
typedef int QElemType;
#include”c3—3、h"
Status InitQueue(SqQueue &Q)
{ //构造一个空队列Q
Q.base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType));
if(!Q。base)//储存分配失败
ﻩexit(OVERFLOW);
ﻩQ。front=Q、rear=0;
return OK;
}
Status DestroyQueue(SqQueue &Q)
{//销毁队列Q,Q不再存在
ﻩif(Q、base)
ﻩﻩfree(Q。base);
Q、base=NULL;
Q、front=Q、rear=0;
return OK;
}
Status ClearQueue(SqQueue &Q)
{//将Q清为空队列
Q、front=Q、rear=0;
ﻩreturn OK;
}
Status QueueEmpty(SqQueue Q)
{//若队列Q为空队列,则返回TREU,否则返回FALSE
if(Q。front==Q.rear)//队列空得标志
ﻩﻩreturn TRUE;
else
return FALSE;
}
int QueueLength(SqQueue Q)
{//Q
ﻩreturn(Q、rear—Q、front+MAXQSIZE)%MAXQSIZE;
}
Status GetHead(SqQueue Q,QElemType &e)
{//
ﻩif(Q、front==Q、rear)//队列空
ﻩreturn ERROR;
ﻩe=*(Q、base+Q、front);
ﻩreturn OK;
}
Status EnQueue(SqQueue &Q,QElemType e)
{
ﻩif((Q.rear+1)%MAXQSIZE==Q、front)//队列满
ﻩ return ERROR;
Q。base[Q、rear]=e;
Q、rear=(Q.rear+1)%MAXQSIZE;
ﻩreturn OK;
}
Status DeQueue(SqQueue &Q,QElemType &e)
{
if(Q、front==Q。rear)//队列空
ﻩﻩreturn ERROR;
e=Q.base[Q.front];
Q。front=(Q.front+1)%MAXQSIZE;
return OK;
}
Status QueueTraverse(SqQueue Q,void(*vi)(QElemType))
{
int i;
ﻩi=Q、front;
ﻩwhile(i!=Q、rear)
{
ﻩﻩvi(*(Q、base+i));
i=(i+1)%MAXQSIZE;
ﻩ}
printf(”\n”);
return OK;
}
void visit(QElemType i)
{
ﻩcout〈〈”\t”<<i;
}
void main()
{
ﻩint i=0,a;
QElemType d;
ﻩSqQueue Q;
InitQueue(Q);
ﻩcout<<”初始化队列后,队列空否?(1:空 0:否)”<<QueueEmpty(Q)<<"\n";
ﻩ cout<<”请输入整型队列元素,-1为提前结束符:\n”;
do
ﻩ{
ﻩﻩ cin>〉d;
ﻩﻩﻩif(d==-1)
ﻩﻩﻩﻩ break;
ﻩ i++;
ﻩ ﻩEnQueue(Q,d);
}
while(i〈MAXQSIZE-1);
cout〈〈”队列长度为:"<〈QueueLength(Q)<〈"\n";
ﻩﻩcout<<”现在队列空否?(1:空 0:否)"〈<QueueEmpty(Q)<<"\n";
ﻩfor(i=1;i〈=QueueLength(Q);i++)
ﻩﻩ{
DeQueue(d);
ﻩﻩﻩcout〈<”删除得元素为:”〈<d〈〈"请输入待插入得元素:";
ﻩﻩ cin>>a;
EnQueue(Q,a);
ﻩ}
ﻩcout<〈"现在队列中得元素为:\n";
ﻩQueueTraverse(Q,visit);
ﻩ cout<<”\n";
GetHead(Q,a);
ﻩ ﻩcout<<"现在对头元素为:"〈〈a<〈”\n";
ClearQueue();
cout<<"清空队列后,对列空否?(1:空 0:否)”〈〈QueueEmpty(Q);
ﻩ cout〈<"\n";
DestroyQueue(Q);
}
五、程序调试结果:
六、试验后得思考:
通过试验,对循环队列得功能有了更深得了解,同时也基本掌握了循环队列得构造、清空、销毁及队列元素得插入与删除等相关操作,也为以后得学习奠定了一定得基础。
展开阅读全文