链队列和循环队列数据结构实验.docx

上传人:b****6 文档编号:3515106 上传时间:2022-11-23 格式:DOCX 页数:14 大小:116.34KB
下载 相关 举报
链队列和循环队列数据结构实验.docx_第1页
第1页 / 共14页
链队列和循环队列数据结构实验.docx_第2页
第2页 / 共14页
链队列和循环队列数据结构实验.docx_第3页
第3页 / 共14页
链队列和循环队列数据结构实验.docx_第4页
第4页 / 共14页
链队列和循环队列数据结构实验.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

链队列和循环队列数据结构实验.docx

《链队列和循环队列数据结构实验.docx》由会员分享,可在线阅读,更多相关《链队列和循环队列数据结构实验.docx(14页珍藏版)》请在冰豆网上搜索。

链队列和循环队列数据结构实验.docx

链队列和循环队列数据结构实验

淮海工学院计算机科学系

实验报告书

课程名:

《数据结构》

题目:

数据结构实验

链队列和循环队列

班级:

学号:

姓名:

 

线性数据结构算法实现与应用报告要求

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语言的了解.

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 小升初

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1