链队列和循环队列数据结构实验.docx
《链队列和循环队列数据结构实验.docx》由会员分享,可在线阅读,更多相关《链队列和循环队列数据结构实验.docx(14页珍藏版)》请在冰豆网上搜索。
![链队列和循环队列数据结构实验.docx](https://file1.bdocx.com/fileroot1/2022-11/23/100dfc1b-d97c-4e9c-afbc-3e3ef432352c/100dfc1b-d97c-4e9c-afbc-3e3ef432352c1.gif)
链队列和循环队列数据结构实验
淮海工学院计算机科学系
实验报告书
课程名:
《数据结构》
题目:
数据结构实验
链队列和循环队列
班级:
学号:
姓名:
线性数据结构算法实现与应用报告要求
1目的与要求:
1)掌握栈与队列的数据类型描述及特点;
2)掌握栈的顺序和链式存储存表示与基本算法的实现;
3)掌握队列的链式存储表示与基本操作算法实现;
4)掌握栈与队列在实际问题中的应用和基本编程技巧;
5)按照实验题目要求,独立完成实际程序的编写编写、调试和运行,并通过用例数据的运行过程抓获相关屏面验证程序设计的正确性;
7)认真书写实验报告,并按时提交。
2实验内容或题目
以下题目学生根据自己的兴趣和能力可选作一道作为实验题目:
1)根据栈数据结构,分别建立一个顺序栈和链式栈并实现其上基本操作(出栈和入栈等);
2)根据队列数据结构,分别建立链队列和循环队列,并完成其上的基本操作(出入队列等);
3)参考书上表达式求值例题,应用栈的基本操作实现带括号表达式求值运算及其进出栈模拟过程(给出程序执行过程中栈的变化过程);
4)阅读P83栈与递归的实现一节内容和3阶汉诺塔问题。
使用栈数据结构解决3阶汉诺塔问题,编写程序并模拟栈及其汉诺塔的搬运过程(给出程序执行过程栈的变化过程与圆盘的搬动状态)。
5)其它实际应用举例(如打印杨辉三角形)。
3实验步骤与源程序
链队列
#include
#include
#include
#defineOK1
#defineERROR0
#defineOVERFLOW0
typedefstructQNode
{
intdata;
structQNode*next;
}QNode,*QueuePtr;
typedefstruct
{
QueuePtrfront;
QueuePtrrear;
}LinkQueue;
intInitQueue(LinkQueue&Q)
{
Q.rear=Q.front=(QueuePtr)malloc(sizeof(QNode));
if(!
Q.rear)
exit(OVERFLOW);
Q.front->next=NULL;
returnOK;
}
voidQueueEmpty(LinkQueueQ)
{
if(Q.front==Q.rear)
printf("该链队为空:
");
else
printf("该链队不为空:
");
}
voidEnQueue(LinkQueue&Q,inte)
{
QueuePtrp;
p=(QueuePtr)malloc(sizeof(QNode));
if(!
p)
printf("error");
p->data=e;
Q.rear->next=p;
Q.rear=p;
printf("元素%d入队成功",e);
}
intEnnQueue(LinkQueue&Q,inte)
{
QueuePtrp;
p=(QueuePtr)malloc(sizeof(QNode));
if(!
p)
returnERROR;
p->data=e;
Q.rear->next=p;
Q.rear=p;
returnOK;
}
voidDeQueue(LinkQueue&Q)
{
QueuePtrp;
if(Q.front==Q.rear)
printf("该链队为空");
p=Q.front->next;
Q.front->next=p->next;
if(Q.rear==p)
Q.rear=Q.front;
free(p);
printf("队首元素删除成功");
}
voidGetHead(LinkQueue&Q)
{
QueuePtrp;
if(Q.front==Q.rear)
printf("该链队为空");
p=Q.front->next;
printf("队首元素为:
%d",p->data);
}
voidOutQueue(LinkQueue&Q)
{
QueuePtrp;
if(Q.front==Q.rear)
printf("该链队为空");
p=Q.front->next;
while(p!
=Q.rear->next)
{
printf("%d",p->data);
p=p->next;
}
}
voidLengthQueue(LinkQueue&Q)
{
intf=0;
QueuePtrp;
if(Q.front==Q.rear)
printf("该队列的长度是:
%d",f);
else
{
p=Q.front->next;
while(p!
=Q.rear->next)
{
p=p->next;
f++;
}
printf("该队列的长度是:
%d",f);
}
}
voidmain()
{
system("cls");
intflag=1,i;
LinkQueueQ;
InitQueue(Q);
printf("************************链队列功能菜单***********************\n");
printf("1:
初始化链队列,2:
判断链队列是否为空,3:
进入队列,4:
取出队首元素\n");
printf("5:
输出该队列的所有元素,6:
输出该队列的长度,7:
结束程序,8:
清屏\n");
while(flag)
{
printf("\n请输入操作符:
");
scanf("%d",&i);
switch(i)
{
case1:
inte,n,k;
printf("请输入队列的长度:
");
scanf("%d",&n);
printf("请输入队列的元素:
");
for(e=1;e<=n;e++)
{
scanf("%d",&k);
EnnQueue(Q,k);
}
printf("初始化链队成功");
break;
case2:
QueueEmpty(Q);
break;
case3:
intj;
printf("请输入要进入队列的元素");
scanf("%d",&j);
EnQueue(Q,j);
break;
case4:
GetHead(Q);
break;
case5:
printf("该队列的元素是:
");
OutQueue(Q);
break;
case6:
LengthQueue(Q);
break;
case7:
flag=0;
break;
case8:
system("cls");
break;
}
}
printf("程序结束");
}
循环队列
#include
#include
#include
#defineMAXSIZE10;
#defineOK1;
#defineERROR0;
#defineOVERFLOW0;
typedefstruct
{
int*data;
intfront;
intrear;
}SqQueue;
intInitQueue_Sq(SqQueue&Q)
{
Q.data=(int*)malloc(10*sizeof(int));
if(!
Q.data)
exit(0);
Q.front=Q.rear=0;
returnOK;
}
intEnQueue_Sq(SqQueue&Q,inte)
{
if((Q.rear+1)%10==Q.front)
returnERROR;
Q.data[Q.rear]=e;
Q.rear=(Q.rear+1)%10;
returnOK;
}
voidIfEmpty(SqQueueQ)
{
if(Q.rear=Q.front)
printf("该循环队列是空队列\n");
else
printf("该循环队列不是空队列\n");
}
voidIfFull(SqQueueQ)
{
if((Q.rear+1)%10==Q.front)
printf("该循环队列已满\n");
else
printf("该循环队列未满\n");
}
voidInQueue_Sq(SqQueue&Q,inte)
{
if((Q.rear+1)%10==Q.front)
printf("循环队列已满\n");
else
{
Q.data[Q.rear]=e;
Q.rear=(Q.rear+1)%10;
printf("元素%d成功进入循环队列\n",e);
}
}
voidDeQueue_Sq(SqQueue&Q)
{
inte;
if(Q.front==Q.rear)
printf("循环队列为空\n");
e=Q.data[Q.front];
printf("循环队列队首元素是:
%d\n",e);
}
voidDE_Sq(SqQueue&Q)
{
int*w;
w=&Q.data[Q.front];
Q.front=Q.front+1;
printf("队首元数%d删除成功\n",*w);
}
intLength_Sq(SqQueue&Q)
{
ints;
s=(Q.rear-Q.front+10);
returns%10;
}
intOutQueue_Sq(SqQueueQ)
{
SqQueuep;
p=Q;
inti,n;
n=Length_Sq(p);
for(i=0;i{
printf("%d",p.data[p.front]);
p.front++;
}
returnOK;
}
voidDelet(SqQueue&Q)
{
free(Q.data);
printf("释放成功");
}
voidmain()
{
system("cls");
printf("**********************循环队列功能菜单***********************\n");
printf("1.初始化队列输入的数不超过10个,2.判断队列是否空,3.判断队列是否满,\n");
printf("4.将元素入队,5.取队列首元素,6.队列的长度,7.遍历循环队列,\n");
printf("8.删除队首元素,9.释放队列,10.清屏,0.结束程序,\n");
intflag=1,i;
SqQueueQ;
InitQueue_Sq(Q);
while(flag)
{
printf("请输入操作符:
");
scanf("%d",&i);
switch(i)
{
case1:
intn,j,m;
printf("请输入初始化元素的个数:
");
scanf("%d",&n);
printf("请输入元素:
");
for(j=0;j{
scanf("%d",&m);
EnQueue_Sq(Q,m);
}
break;
case2:
IfEmpty(Q);
break;
case3:
IfFull(Q);
break;
case4:
intk;
printf("请输入要进入循环队列的元素:
");
scanf("%d",&k);
InQueue_Sq(Q,k);
break;
case5:
DeQueue_Sq(Q);
break;
case6:
intf;
f=Length_Sq(Q);
printf("该循环队列的长度为:
%d\n",f);
break;
case7:
printf("该循环队列为:
");
OutQueue_Sq(Q);
printf("\n");
break;
case8:
DE_Sq(Q);
break;
case9:
Delet(Q);
break;
case10:
system("cls");
break;
case0:
flag=0;
break;
}
}
printf("程序结束");
}
4测试数据与实验结果(可以抓图粘贴)
链队列执行结果
循环队列执行结果:
5结果分析与实验体会
通过此次的数据结构实验,让我对队列的基本结构有了进一步了解了,以及队列上一些基本操作的实现,掌握了队列在我们实际生活中的应用以及在编程时的基本技巧.不过在编程过程中还是出现了让人头疼的地方,不过同过自己的翻阅资料还是可以独立的解决编程中的问题的,通过本次的实验让自己所学的知识得到了进一步的巩固,加深了对C语言的了解.