数据结构队列实验报告Word文件下载.docx
《数据结构队列实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构队列实验报告Word文件下载.docx(50页珍藏版)》请在冰豆网上搜索。
![数据结构队列实验报告Word文件下载.docx](https://file1.bdocx.com/fileroot1/2022-10/28/814749df-fef8-47d8-9145-34d112214a13/814749df-fef8-47d8-9145-34d112214a131.gif)
5
分别执行“元素入队”“元素出队”“销毁队列”“清空队列”等操作。
2.顺序队列
1)在本演示程序中,首先要顺序队列添加一个头结点,并判断队列是否为空,它只允许在表的一端进行插入,而在另一端删除元素,允许插入的一段叫队尾,允许删除的一端则为对头,接着访问队列中所有元素,并输出,输出是每个元素之间用空格来完成。
2)演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“欢迎来到链队列”“元素入队”“元素出队”“取得头结点”“输出显示”之后。
欢迎来到顺序队列
1入队
2出队
3判断是否为空
4取得头结点
5输出显示
6退出顺序队列
分别执行“元素入队”“元素出队”等操作。
3循环队列
1)在本演示程序中,首先要顺序队列添加一个头结点,并判断队列是否为空,初始化建空队列时,令front=rear=0,每当插入新的队列尾元素时,“尾指针增1”;
每当删除队列头元素时,“头指针增1”。
接着访问队列中所有元素,并输出,输出是每个元素之间用空格来完成。
欢迎来到循环队列
2.概要设计(xxxx)
⒈为实现上述算法,需要顺序表的抽象数据类型,抽象数据类型定义如下:
ADTQueue{
数据对象:
D={ai|ai∈ElemSet,i=1,2,3...,n,n>
=0}
数据关系:
R={<
ai-1,ai>
|ai-1,ai∈D,i=2,...,n}
基本操作:
InitQueue(&
Q)
操作结果:
构造一个空队列。
DestroyQueue(&
初始条件:
队列Q已存在。
队列Q已被销毁。
ClearQueue(&
将Q清为空队列。
QueueEmpty(Q)
若Q为空队列,则返回TRUE,否则FALSE。
QueueLength(Q)
返回Q元素的个数,即队列的长度。
GetHead(Q,&
e)
初始条件:
Q为非空队列。
用e返回Q的队头元素。
EnQueue(&
Q,e)
插入e返回Q的新的队尾元素。
DeQueue(&
Q,&
删除Q的队头元素,并用e返回其值。
}ADTQueue
2.单链队列
typedefstructQNode
{
QElemType;
structQNode*next;
//指针域
}QNode,*QueuePtr;
Typedefstruct{
QueuePtrfront;
QueuePtrrear;
}LinkQueue;
StatusInitQueue(LinkQueue&
//构造一个空队列。
StatusDestroyQueue(LinkQueue&
//销毁队列Q,Q不存在。
StatusClearQueue(LinkQueue&
//将Q清为空队列。
StatusQueueEmpty(LinkQueueQ)
//若Q为空队列,则返回TRUE,否则FALSE。
intQueueLength(LinkQueueQ)
//返回Q元素的个数,即队列的长度。
StatusGetHead(LinkQueueQ,QElemType&
//若队列不为空,则用e返回Q的队头元素,并返回OK;
否则返回ERROR。
StatusEnQueue(LinkQueue&
Q,QElemTypee)
//插入e返回Q的新的队尾元素。
StatusDeQueue(LinkQueue&
Q,QElemType&
//若队列不空,则删除Q的队头元素,并用e返回其值,并返回OK;
三.详细设计(xxx)
1.顺序队列的实现和运算
1)元素的类型
typedefstruct
{
Datatypedata[MAXSIZE];
intfront,rear;
}Squeue;
2)空的队列的构造
voidInitSqueue(Squeue*p)/*初始化队列*/
p->
front=0;
rear=0;
}
3)元素的入队
intEnsqueue1(Squeue1*q,Datatypee)/*入队*/
if((q->
rear+1)%MAXSIZE==q->
front)
printf("
\n队列已满\n"
);
return0;
4)元素的出队
intDeSqueue1(Squeue1*q,Datatype*e)/*出队*/
if(q->
front==q->
rear)
队列已空,无法出队!
"
*e=q->
data[q->
front];
q->
front=(q->
front+1)%MAXSIZE;
return1;
5)判断队列是否为空
intQueueEmpty1(Squeue1q)//判断是否为空
if(q.front==q.rear)
else
6)队头元素的取值的算法
intGethead1(Squeue1*q,Datatype*e)//取对头元素
rear)
队列已空,无法出队!
7)遍历顺序队列的算法
voiddisplay1(Squeue1q)//遍历顺序对列
此队列数据为:
\n"
if(q.front==q.rear)
此队列为空!
while(q.front<
q.rear)
%d\t"
q.data[q.front]);
q.front=(q.front+1)%MAXSIZE;
2.链式队列的实现和运算
1)构造空队列的算法
voidInitQueue2(LinkQueue*q)
{//构造一个空队列Q
front=q->
rear=malloc(sizeof(QNode));
if(!
q->
exit
(1);
front->
next=NULL;
}
2)元素的入队算法
voidEnQueue2(LinkQueue*q,QElemTypee)//将元素e进队
QueuePtrp;
p=(QueuePtr)malloc(sizeof(QNode));
//创建新节点
p)//如果内存分配成功
exit
(1);
p->
data=e;
//初始化新节点数据为e
q->
rear->
next=p;
rear=p;
3)元素的出队的算法
intDeQueue2(LinkQueue*q,QElemTypee)//队头结点出队,将出队的元素存入e
if(q->
rear)//队列为空
return0;
p=q->
next;
//初始化temp为要出队的结点指针
next==q->
rear)//要出队的结点为最后一个结点
rear=q->
front;
e=p->
data;
//要出队的数据元素为e
next=p->
//使下一个结点变为对头
free(p);
//删除要出队的结点
returne;
4)队列的长度算法
voidQueueLength2(LinkQueue*q)//返回队列长度
inti=0;
while(p)
++i;
p=p->
链队列长度为:
%d\n"
i);
5)队列的销毁
voidDestroyQueue2(LinkQueue*q)
while(q->
free(q->
front);
rear;
if(!
free(q->
rear);
free(q->
6)队列的输出算法
voidoutput2(LinkQueue*q)//输出队列
链队列元素依次为:
printf("
%d->
p->
data);
7)队列的清空的算法
voidClear2(LinkQueue*q)//清空队列
QueuePtrtemp=q->
while(temp)
QueuePtrtp=temp;
temp=temp->
free(tp);
temp=q->
rear=NULL;
free(temp);
8)返回对头元素的算法
int