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