1、链队列和循环队列数据结构实验淮海工学院计算机科学系实验报告书课程名: 数据结构 题 目: 数据结构实验 链队列和循环队列 班 级: 学 号: 姓 名: 线性数据结构算法实现与应用报告要求1目的与要求:1)掌握栈与队列的数据类型描述及特点;2)掌握栈的顺序和链式存储存表示与基本算法的实现;3)掌握队列的链式存储表示与基本操作算法实现;4) 掌握栈与队列在实际问题中的应用和基本编程技巧;5)按照实验题目要求,独立完成实际程序的编写编写、调试和运行,并通过用例数据的运行过程抓获相关屏面验证程序设计的正确性;7)认真书写实验报告,并按时提交。2 实验内容或题目以下题目学生根据自己的兴趣和能力可选作一道
2、作为实验题目:1) 根据栈数据结构,分别建立一个顺序栈和链式栈并实现其上基本操作(出栈和入栈等);2) 根据队列数据结构,分别建立链队列和循环队列,并完成其上的基本操作(出入队列等);3) 参考书上表达式求值例题,应用栈的基本操作实现带括号表达式求值运算及其进出栈模拟过程(给出程序执行过程中栈的变化过程);4) 阅读P83栈与递归的实现一节内容和3阶汉诺塔问题。使用栈数据结构解决3阶汉诺塔问题,编写程序并模拟栈及其汉诺塔的搬运过程(给出程序执行过程栈的变化过程与圆盘的搬动状态)。5) 其它实际应用举例(如打印杨辉三角形)。3 实验步骤与源程序 链队列#include#include#inclu
3、de#define OK 1#define ERROR 0#define OVERFLOW 0typedef struct QNode int data; struct QNode *next;QNode,*QueuePtr;typedef struct QueuePtr front; QueuePtr rear;LinkQueue;int InitQueue(LinkQueue &Q) Q.rear=Q.front=(QueuePtr)malloc(sizeof(QNode); if(!Q.rear) exit(OVERFLOW); Q.front-next=NULL; return OK;
4、void QueueEmpty(LinkQueue Q) if(Q.front=Q.rear) printf(该链队为空:); else printf(该链队不为空:);void EnQueue(LinkQueue &Q,int e) QueuePtr p; p=(QueuePtr)malloc(sizeof(QNode); if(!p) printf(error); p-data=e; Q.rear-next=p; Q.rear=p; printf(元素%d入队成功,e);int EnnQueue(LinkQueue &Q,int e) QueuePtr p; p=(QueuePtr)mal
5、loc(sizeof(QNode); if(!p) return ERROR; p-data=e; Q.rear-next=p; Q.rear=p; return OK;void DeQueue(LinkQueue &Q) QueuePtr p; 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(队首元素删除成功);void GetHead(LinkQueue &Q) QueuePtr p; if(Q.front=
6、Q.rear) printf(该链队为空); p=Q.front-next; printf(队首元素为:%d,p-data);void OutQueue(LinkQueue &Q) QueuePtr p; if(Q.front=Q.rear) printf(该链队为空); p=Q.front-next; while(p!=Q.rear-next) printf(%d,p-data); p=p-next; void LengthQueue(LinkQueue &Q) int f=0; QueuePtr p; if(Q.front=Q.rear) printf(该队列的长度是:%d,f); els
7、e p=Q.front-next; while(p!=Q.rear-next) p=p-next; f+; printf(该队列的长度是:%d,f); void main() system(cls); int flag=1,i; LinkQueue Q; InitQueue(Q); printf(*链队列功能菜单*n); printf(1:初始化链队列, 2:判断链队列是否为空, 3:进入队列, 4:取出队首元素n); printf(5:输出该队列的所有元素,6:输出该队列的长度, 7:结束程序, 8:清屏n); while(flag) printf(n请输入操作符:); scanf(%d,&
8、i); switch(i) case 1: int e,n,k; printf(请输入队列的长度:); scanf(%d,&n); printf(请输入队列的元素:); for(e=1;e=n;e+) scanf(%d,&k); EnnQueue(Q,k); printf(初始化链队成功); break; case 2: QueueEmpty(Q); break; case 3: int j; printf(请输入要进入队列的元素); scanf(%d,&j); EnQueue(Q,j); break; case 4: GetHead(Q); break; case 5: printf(该队列
9、的元素是:); OutQueue(Q); break; case 6: LengthQueue(Q); break; case 7: flag=0; break; case 8: system(cls); break; printf(程序结束);循环队列#include#include#include#define MAXSIZE 10;#define OK 1;#define ERROR 0;#define OVERFLOW 0;typedef struct int *data; int front ; int rear;SqQueue;int InitQueue_Sq(SqQueue &Q
10、) Q.data=(int*)malloc(10*sizeof(int); if(!Q.data) exit(0); Q.front=Q.rear=0; return OK;int EnQueue_Sq(SqQueue &Q,int e) if(Q.rear+1)%10=Q.front) return ERROR; Q.dataQ.rear=e; Q.rear=(Q.rear+1)%10; return OK;void IfEmpty(SqQueue Q) if(Q.rear=Q.front) printf(该循环队列是空队列n); else printf(该循环队列不是空队列n);void
11、IfFull(SqQueue Q) if(Q.rear+1)%10=Q.front) printf(该循环队列已满n); else printf(该循环队列未满n);void InQueue_Sq(SqQueue &Q,int e) if(Q.rear+1)%10=Q.front) printf(循环队列已满n); else Q.dataQ.rear=e; Q.rear=(Q.rear+1)%10; printf(元素%d成功进入循环队列n,e); void DeQueue_Sq(SqQueue &Q) int e; if(Q.front=Q.rear) printf(循环队列为空n); e=
12、Q.dataQ.front; printf(循环队列队首元素是:%dn,e);void DE_Sq(SqQueue &Q) int *w; w=&Q.dataQ.front; Q.front=Q.front+1; printf(队首元数%d删除成功n,*w);int Length_Sq(SqQueue &Q) int s; s=(Q.rear-Q.front+10); return s%10;int OutQueue_Sq(SqQueue Q) SqQueue p; p=Q; int i,n; n=Length_Sq(p); for(i=0;in;i+) printf(%d,p.datap.f
13、ront); p.front+; return OK;void Delet(SqQueue &Q) free(Q.data); printf(释放成功);void main() system(cls); printf(*循环队列功能菜单*n); printf(1.初始化队列输入的数不超过10个,2.判断队列是否空,3.判断队列是否满, n); printf(4.将元素入队, 5.取队列首元素, 6.队列的长度, 7.遍历循环队列,n); printf(8.删除队首元素, 9.释放队列, 10.清屏, 0.结束程序,n); int flag=1,i; SqQueue Q; InitQueue_S
14、q(Q); while (flag) printf(请输入操作符:); scanf(%d,&i); switch(i) case 1: int n,j,m; printf(请输入初始化元素的个数:); scanf(%d,&n); printf(请输入元素:); for(j=0;jn;j+) scanf(%d,&m); EnQueue_Sq(Q,m); break; case 2: IfEmpty(Q); break; case 3: IfFull(Q); break; case 4: int k; printf(请输入要进入循环队列的元素:); scanf(%d,&k); InQueue_Sq
15、(Q,k); break; case 5: DeQueue_Sq(Q); break; case 6: int f; f=Length_Sq(Q); printf(该循环队列的长度为:%dn,f); break; case 7: printf(该循环队列为:); OutQueue_Sq(Q); printf(n); break; case 8: DE_Sq(Q); break; case 9: Delet(Q); break; case 10: system(cls); break; case 0: flag=0; break; printf(程序结束);4 测试数据与实验结果(可以抓图粘贴) 链队列执行结果循环队列执行结果:5 结果分析与实验体会通过此次的数据结构实验,让我对队列的基本结构有了进一步了解了,以及队列上一些基本操作的实现,掌握了队列在我们实际生活中的应用以及在编程时的基本技巧.不过在编程过程中还是出现了让人头疼的地方,不过同过自己的翻阅资料还是可以独立的解决编程中的问题的,通过本次的实验让自己所学的知识得到了进一步的巩固,加深了对C语言的了解.
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1