顺序队链队实验报告.docx
《顺序队链队实验报告.docx》由会员分享,可在线阅读,更多相关《顺序队链队实验报告.docx(18页珍藏版)》请在冰豆网上搜索。
![顺序队链队实验报告.docx](https://file1.bdocx.com/fileroot1/2023-2/22/641797d2-4837-4948-a47a-90f82cef850e/641797d2-4837-4948-a47a-90f82cef850e1.gif)
顺序队链队实验报告
重庆工商大学
《数据结构》课程实验报告封面
专业班级:
12计算机一班学号:
2012131152
学生姓名:
古应波实验室:
10412
实验题目:
顺序队列、链队列的操作
指导教师:
梁新元成绩:
日期:
2013年10月日第6周星期3节次4-5
评分表
实验报告质量
序号
项目
总分
自评分
互评分
组长评分
教师评分
1
算法思想
2
2
算法描述
3
3
实验数据与结果
10
4
总结
4
5
排版
2
源程序质量
6
正确性
63
7
友好性
4
8
可读性
4
9
健壮性
4
10
创新与多样性
4
合计
总分
评分人签字
实验报告的内容与要求
一、实验题目
顺序队列、链队列的基本操作
二、实验目的
了解顺序队列、链队列的结构特点及有关概念,掌握其基本操作算法。
三、实验内容
实现顺序队列和链队列的初始化、进队、出队、销毁操作
四、实验要点与要求
1.处理的数据类型即ElemType的类型
基本版要求:
整型、字符型
扩展版要求:
字符串型(基础较好的同学)
2.必须采用函数调用
五、算法思想
队列的特点是一端进,另一端出,由此需要定义队首指针和队尾指针,分别用于出队和进队的相关操作
boolInQuene(SqQuene*&q,ElemTyped)//入队元素
{
if(q->rear==MaxSize-1)
{
cout<<"队满!
"<returnfalse;
}
q->rear++;
q->data[q->rear]=d;
returntrue;
}
判断队列为满的条件为队尾指针指向数组最大处,由于出队的方式所限,顺序队会出现假溢出的情况,为了解决这个问题,可以采用环队或者链队代替。
链队算法如下
boolInNode(SqNode*&n,ElemType&e)
{
QNode*q;
q=(QNode*)malloc(sizeof(QNode));
q->data=e;
q->next=NULL;
if(n->rear==NULL)
n->front=n->rear=q;
else
{
n->rear->next=q;
n->rear=q;
}
cout<<"入队成功!
"<returntrue;
}
和所有的链式储存模式一样,在进行新填数据的时候都需要分配空间,修改相应的指针域,链式储存模式没有队列最大值的性质就解决了顺序队列假溢出的问题
六、算法描述及流程图
七、实验数据及实验结果
序号
测试类型
输入数据
期望输出结果
实际输出结果
测试结论
合法数据
1,2,a,b,
1,2,a,b,
1,2,a,b
测试成功,程序正确执行
非法数据
-1
1.5
go
-1
1.5
go
-
1压栈成功
.5丢失
g压栈成功
o丢失
不符合程序预设的数据处理类型,程序执行,但是得不到期望的结果
八、程序组成结构示意图
九、顺序队列调试截图
十、链队列调试截图
十一、顺序队列源代码
//实现顺序队列的入队,出队,遍历操作
//采用字符型储存数据,指针型引用做形参
#include
#include
#defineMaxSize100
usingnamespacestd;
typedefcharElemType;
typedefstructMyQuene
{
ElemTypedata[MaxSize];
intfront;
intrear;
intcount;
intno;
}SqQuene;
voidInit(SqQuene*&q);//初始化
voidDestory(SqQuene*&q);//销毁队列
boolInQuene(SqQuene*&q,ElemTyped);//入队
boolOutQuene(SqQuene*&q,ElemType&d);//出队对首元素
voidDispQuene(SqQuene*&q,ElemTyped);//列取当前队列所有元素
voidSearch(SqQuene*q,ElemTyped);//搜索元素
voidInit(SqQuene*&q)//初始化队列
{
q=(SqQuene*)malloc(sizeof(SqQuene));
q->front=q->rear=-1;
q->count=-1;
q->no=0;
}
voidDestory(SqQuene*&q)//销毁队列
{
free(q);
}
boolInQuene(SqQuene*&q,ElemTyped)//入队元素
{
if(q->rear==MaxSize-1)
{
cout<<"队满!
"<returnfalse;
}
q->rear++;
q->data[q->rear]=d;
returntrue;
}
boolOutQuene(SqQuene*&q,ElemType&d)//出队元素
{
if(q->front==q->rear)
returnfalse;
q->front++;
d=q->data[q->front];
returntrue;
}
voidDispQuene(SqQuene*&q,ElemTyped)//遍历队列元素
{
cout<<"所有元素:
";
for(inti=q->front+1;i<=q->rear;i++)
{
q->front++;
d=q->data[q->front];
cout<<""<}
cout<q->front=q->count;
}
voidmain()
{
SqQuene*q;
ElemTyped;
intn,choose;
Init(q);
for(;;)
{
cout<<"<*********************>"<cout<<"<*1.入队元素*>"<cout<<"<*2.出队元素*>"<cout<<"<*3.遍历队列*>"<cout<<"<*4.退出*>"<cout<<"<*********************>"<cout<<"请选择:
";
cin>>choose;
switch(choose)
{
case1:
do{
cout<<"输入您需要入队的个数(n<="<";
cin>>n;
q->no=q->no+n;
}
while(n>MaxSize||n<1);
for(inti=0;i{
cout<<"元素"<
";
cin>>d;
InQuene(q,d);
}
cout<case2:
if(q->front==q->rear)
{
cout<<"\n队列为空,请入队数据!
"<break;
}
else{
cout<<"输入您需要出队的个数(n<="<no<<"):
";
cin>>n;
if(n>q->no)
{
cout<<"需要弹出元素个数比实际元素多,将弹出队列所有元素!
"<n=q->no;
}
for(inti=0;i{
cout<<"元素"<
";
OutQuene(q,d);
q->count++;
cout<q->no--;
}
}
break;
case3:
if(q->front==q->rear)
{
cout<<"\n队列为空,请入队数据!
"<break;
}
else
{
DispQuene(q,d);
break;
}
case4:
exit(0);
}
}
Destory(q);
}
十二、链队列源代码
//实现链队列的初始化、销毁、元素进队、出队等操作
//采用字符型数据存储模式,指针型引用做形参
#include
#include
usingnamespacestd;
typedefcharElemType;
typedefstructMyNode
{
ElemTypedata;
structMyNode*next;
}QNode;
typedefstruct
{
QNode*front;
QNode*rear;
}SqNode;
voidInit(SqNode*&n)
{
n=(SqNode*)malloc(sizeof(SqNode));
n->front=n->rear=NULL;
}
voidDestory(SqNode*&n)
{
free(n);
}
boolInNode(SqNode*&n,ElemType&e)
{
QNode*q;
q=(QNode*)malloc(sizeof(QNode));
q->data=e;
q->next=NULL;
if(n->rear==NULL)
n->front=n->rear=q;
else
{
n->rear->next=q;
n->rear=q;
}
cout<<"入队成功!
"<returntrue;
}
boolOutNode(SqNode*&n,ElemType&e)
{
QNode*p;
if(n->rear==NULL)
{
cout<<"队列为空\n"<returnfalse;
}
p=n->front;
n->front=n->front->next;
e=p->data;
free(p);
returntrue;
}
voidmain()
{
SqNode*n;
ElemTypee;
intchoose;
Init(n);
for(;;)
{
cout<<"<*********************>"<cout<<"<*1.入队元素*>"<cout<<"<*2.出队元素*>"<cout<<"<*3.退出*>"<cout<<"<*********************>"<cout<<"请选择:
";
cin>>choose;
switch(choose)
{
case1:
cout<<"输入需要入队的元素:
";
cin>>e;
InNode(n,e);break;
case2:
if(OutNode(n,e))
{
cout<<"当前队首元素为:
"<break;
}
else
break;
case3:
exit(0);
}
}
Destory(n);
}