数据结构04队列的基本操作.docx
- 文档编号:3742831
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:14
- 大小:94.05KB
数据结构04队列的基本操作.docx
《数据结构04队列的基本操作.docx》由会员分享,可在线阅读,更多相关《数据结构04队列的基本操作.docx(14页珍藏版)》请在冰豆网上搜索。
数据结构04队列的基本操作
《数据结构》实验报告
院系光电与信息工程学院专业电子信息工程
姓名学号电话
2011级2班2013年4月20日
1.实验题目
实验4.对列的基本操作
2.需求分析
(1)编写链接队列的基本操作函数,调用上述函数实现下列操作,操作步骤如下:
调用进队函数建立一个队列。
读取队列中的第一个元素。
从队列中删除元素。
输出队列中的所有元素。
(2)编写环型队列的基本操作函数。
调用上述函数实现下列操作,操作步骤如下:
调用进队函数建立一个队列。
读取队列中的第一个元素。
从队列中删除元素。
输出队列中的所有元素。
链接队列:
①进队操作EnQueue(LinkQueue*Q,QElemTypee)
②出队操作,队空DeQueue(LinkQueue*Q,QElemType*e)
③输出队列中元素0utputQueue(LinkQueueQ)
环型队列:
①进队操作,返回1为队满EnQueue(SqQueue*Q,QElemTypee)
②出队操作,返回1为队空DeQueue(SqQueue*Q,QElemType*e)
③输出队列中元素outPutQMeue(SqQueueQ)
输入形式:
整型数。
3.概要设计
(1)链接队列
ADTQNode{
数据对象:
D={ai|ai∈IntegerSet,i=0,1,2,…,n,n≥0}
结构关系:
R={
基本操作:
InitQueue(LinkQueue*Q)
操作前提:
Q是一个未初始化的链接队列
操作结果:
将Q初始化为一个空的链接队列
EnQueue(LinkQueue*Q,QElemTypee)
操作前提:
链接队列Q已存在
操作结果:
将元素e插入到链接队列中
DeQueue(LinkQueue*Q,QElemType*e)
操作前提:
链接队列Q已存在
操作结果:
将链接队列Q中队头元素删除,删除的元素值通过e返回
0utputQueue(LinkQueueQ)
操作前提:
链接队列Q已存在
操作结果:
将链接队列Q中的元素显示到屏幕上
}
本程序包含5个函数:
•主函数main()
•初始化链接队列函数InitQueue()
•进队函数EnQueue()
•出队函数DeQueue()
•输出队列中元素函数OutputStack()
各函数调用关系:
主函数main调用其他四个函数
主函数的伪码
main()
{
定义变量i,n,m;
定义一个LinkQueue变量Lq
初始化Lq;
输入队列元素的个数;
For循环(i=1;i<=n;i++)
{调用EnQueue函数;}
输出队列中元素;
调用DeQueue函数;
显示删除的队头元素;
显示Lq;
}
(2)环形队列
ADTSqQueue{
数据对象:
D={ai|ai∈IntegerSet,i=0,1,2,…,n,n≥0}
结构关系:
R={
基本操作:
InitQueue(SqQueue&Q)
操作前提:
Q是一个未初始化的环型队列
操作结果:
将Q初始化为一个空的环型队列
EnQueue(SqQueue*Q,inte)
操作前提:
环型队列Q已存在
操作结果:
将元素e插入到队列中
DeQueue(SqQueue*Q,int*e)
操作前提:
环型队列Q已存在
操作结果:
将环型队列Q中队头元素删除,删除的元素值通过e返回
outPutQMeue(SqQueue*Q)
操作前提:
环型队列Q已存在
操作结果:
将环型队列Q中的元素显示到屏幕上
}
本程序包含5个函数:
•主函数main()
•初始化链接队列函数InitQueue()
•进队函数EnQueue()
•出队函数DeQueue()
•输出队列中元素函数OutputStack()
各函数调用关系:
主函数main调用其他四个函数
函数的伪码
main()
{定义SqQueue变量sq;
定义整型变量n,i,m;
构造空的环型队列;
输入队列的长度;
For循环(i=1;i<=n;i++)
{调用EnQueue函数;}
输出队列元素;
删除对头元素;
输出队列元素;
}
4.详细设计
(1)链接队列
(1)类型定义
typedefstructQNode{
intdata;
structQNode*next;
}QNode,*QueuePtr;
typedefstruct{
QueuePtrfront;
QueuePtrrear;
}LinkQueue;
基本操作的伪码算法
(1)初始化
voidInitQueue(LinkQueue*Q){
Q->front=Q->rear==申请新结点;
Q->front->next=NULL;}
(2)进队
voidPush(SqStack&S,inte)
{
定义QueuePtr变量p;
p=申请新的空间;
如果申请失败,结束程序
p->data=e;
p->next=NULL;
如果是第一个元素则{Q->front->next=p;}
Q->rear->next=p;
Q->rear=p;
}
(3)出队
intPop(SqStack*S,inte)
{
定义QueuePtr变量p;
如果队空则返回0;
p=Q->front->next;
*e=p->data;
Q->front->next=p->next;
如果Q->rear==p则Q->rear=Q->front;;
释放p的空间;
返回1;
}
(4)输出元素
intOutputQueue(LinkQueueQ)
{
定义QueuePtr变量p;如果队空则返回0;
p=Q.front->next;
while(p)
{
printf("%d",p->data);
p=p->next;
}
printf("\n");
返回1;
}
(2)环形队列
类型定义
typedefstruct{
int*base;
intfront;
intrear;
}SqQueue;
基本操作的伪码算法
(1)初始化
voidInitQueue(SqQueue&Q){
Q.base=申请新的空间;
如果申请失败,结束程序;
Q.front=Q.rear=0;}
(2)进队
intEnQueue(SqQueue*Q,inte)
{如果队满了则返回1;
Q->base[Q->rear]=e;
Q->rear=(Q->rear+1)%MAXQSIZE;
返回0;}
出队
intDeQueue(SqQueue*Q,int*e)DeQueue(SqQueue*Q,int*e)
{
如果队空则返回1;
*e=Q->base[Q->front];
Q->front=(Q->front+1)%MAXQSIZE;
返回0;
}
(4)输出元素
voidoutPutQMeue(SqQueue*Q)
{
定义整型变量i;
For循环(i=Q->front;i
{输出Q->base[i];}
换行;
}
5.调试分析
链接队列:
调试是出现错误,经过检查发现在某些地方分号用中文表示,出现空指针问题。
环型队列:
出现空指针问题,内存不能读取等
6.使用说明
(1)链接队列:
程序执行过程如下:
提示用户输入元素个数;
用户按要求输入一个整型数;
程序输出构造好的链接队列;
调用出队函数,并把剩余元素显示在屏幕上;
(2)环型队列:
程序执行过程如下:
提示用户输入队列元素个数;
用户按要求输入一个整型数;
程序用输入的整型数构建一个环型队列,并输出队列元素;
调用出栈函数,删除栈顶,显示栈中元素;
7.测试结果
(1)链接队列
构造一个空的链接队列后,屏幕显示:
请输入队列的元素个数:
输入5后,
屏幕显示建立的队列元素:
12345
调用出队函数后,屏幕显示:
2345
(2)环形队列
建立空队列,程序运行后屏幕显示:
输入队列元素的长度
输入5后,
屏幕显示队列的元素:
12345
接着屏幕又显示:
队列中的第一个元素为:
1
调用出队函数,然后输入队列中元素:
2345
8.参考文献
数据结构(c语言版)
9.附录
源程序文件如下:
(1)链接队列
#include
#include
typedefstructQNode{
intdata;
structQNode*next;
}QNode,*QueuePtr;
typedefstruct{
QueuePtrfront;
QueuePtrrear;
}LinkQueue;
voidInitQueue(LinkQueue*Q)
{
Q->front=Q->rear=(QNode*)malloc(sizeof(QNode));
Q->front->next=NULL;
}
voidEnQueue(LinkQueue*Q,inte)
{
QueuePtrp;
p=(QueuePtr)malloc(sizeof(QNode));
if(!
p)exit
(1);
p->data=e;
p->next=NULL;
if(Q->front->next==NULL)
{Q->front->next=p;}
Q->rear->next=p;
Q->rear=p;
}
intDeQueue(LinkQueue*Q,int*e)
{
QueuePtrp;
if(Q->front==Q->rear)return0;
p=Q->front->next;
*e=p->data;
Q->front->next=p->next;
if(Q->rear==p){Q->rear=Q->front;}
free(p);
return1;
}
intOutputQueue(LinkQueueQ)
{
QueuePtrp;
if(Q.front==Q.rear)return0;
p=Q.front->next;
while(p)
{
printf("%d",p->data);
p=p->next;
}
printf("\n");
return1;
}
voidmain()
{inti,n;
intm;
LinkQueueLq;
printf("构造一个空的链接队列");
InitQueue(&Lq);
printf("\n请输入队列的元素个数:
");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
EnQueue(&Lq,i);
}
printf("队列中的元素为:
");
OutputQueue(Lq);
DeQueue(&Lq,&m);
printf("删除队列中的第一个元素\n此时队列中的元素为:
");
OutputQueue(Lq);
}
(2)环形队列
#include
#include
#defineMAXQSIZE100
typedefstruct{
int*base;
intfront;
intrear;
}SqQueue;
voidInitQueue(SqQueue&Q){
Q.base=(int*)malloc(MAXQSIZE*sizeof(int));
if(!
Q.base)exit
(1);
Q.front=Q.rear=0;
}
intEnQueue(SqQueue*Q,inte)
{
if((Q->rear+1)%MAXQSIZE==Q->front)return1;
Q->base[Q->rear]=e;
Q->rear=(Q->rear+1)%MAXQSIZE;
return0;
}
intDeQueue(SqQueue*Q,int*e)
{
if(Q->front==Q->rear)return1;
*e=Q->base[Q->front];
Q->front=(Q->front+1)%MAXQSIZE;
return0;
}
voidoutPutQMeue(SqQueue*Q)
{
inti;
for(i=Q->front;i
{
printf("%d",Q->base[i]);
}
printf("\n");
}
voidmain()
{
SqQueuesq;
intn,i,m;
printf("构造空的环型队列\n");
InitQueue(sq);
printf("请输入队列的长度:
");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
EnQueue(&sq,i);
}
printf("队列的元素为:
");
outPutQMeue(&sq);
DeQueue(&sq,&m);
printf("队列中的第一个元素为:
%d",m);
printf("\n删除对头元素,输出队列元素:
");
outPutQMeue(&sq);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 04 队列 基本 操作
![提示](https://static.bdocx.com/images/bang_tan.gif)