1、电子信息学院实 验 报 告 书课 程 名 : 数据结构 题 目: 循环队列的实现和运算 实验类别 设计 班 级: BX1206 学 号: 23 姓 名: 张善干 2013 年 11 月 4 日算法设计与分析 实验报告 - 1 -1、 实验题目(1) 复习C(或C+)语言的基本描述方法;(2) 掌握结构体及数组的用法;(3) 提高运用C(C+)语言解决问题的能力;(4) 通过实验程序,分析它们的时间复杂度。2、 实验内容(1) 在顺序存储结构上实现输出受限制的双端循环队列的入队和出队。 (只允许对头输出)的算法。(2) 设每个元素表示一个待处理的作业,元素值表示作业的预计时间。入队列采取简化的短
2、作业原则,若一个新提交的作业的预计时间小于队头和队尾作业的平均时间,则插入在队头,否则插入在队尾。(3) 循环队列数据类型:#define MAXLEN 10typedef structint dataMAXLEN;int front,rear;csequeue;(4) 入队作业处理的预计执行时间可以用随机函数 rand()产生,也可以从键盘输入。3、 实验要求(1) 利用 C(C+)语言完成程序设计。(2) 上机调试通过实验程序。(3) 输入数据,检验程序运行结果。(4) 给出具体的算法分析,包括时间复杂度和空间复杂度。(5) 撰写实验报告。4、实验步骤与源程序 实验步骤首先是在自己的本子上
3、,编写自己设计的程序。之后将它输入到电脑上,并调试。算法设计与分析 实验报告 - 2 -发现问题后,改写程序,使之达到要求。录入数据,进行检验。撰写实验报告。 源代码#include#define MAXLEN 10typedef structint dataMAXLEN;int front,rear;csequeue;void InitQueue(csequeue q.rear=MAXLEN-1;int IsEmpty(csequeue q)if(q.rear=q.front)return 1;elsereturn 0;int IsFull(csequeue q)if(q.rear+1)%M
4、AXLEN=q.front)return 1;else算法设计与分析 实验报告 - 3 -return 0;int InrQueue(csequeue return 0;else q.rear=(q.rear+1)%MAXLEN;q.dataq.rear=x;return 1;void InfQueue(csequeue if (q.front=(q.rear+1) % MAXLEN ) printf(“ntt 队满,不能入队! n“); return; q.dataq.front-=x;printf(“元素成功插入队首 %dn“,q.dataq.front+1);int OutQueue(c
5、sequeue return 0;else q.front=(q.front+1)%MAXLEN;算法设计与分析 实验报告 - 4 -x=q.dataq.front;return 1;void ShowQueue(csequeue q)int k=q.front;if (k=q.rear) printf(“ntt 此队列为空! n“); return;printf(“ntt 此队列元素为:“);do k=(k+1)%MAXLEN;printf(“%4d“,q.datak); while(k!=q.rear);printf(“n“);void main()csequeue q;InitQueue
6、(q);int a8;int i,k,ave;for(i=0;i8;i+) scanf(“%d“,InrQueue(q,ai);printf(“当前队列为: n“);ShowQueue(q);ave=(q.data(1+q.front)%MAXLEN+q.data(q.rear)/2;scanf(“%d“,if(kave)算法设计与分析 实验报告 - 5 -InfQueue(q,k);elseInrQueue(q,k);printf(“现在的队列是: n“);ShowQueue(q);5、测试数据与实验结果(可以抓图粘贴)6、结果分析与实验体会如截图那样,当输入的整数数据含有 0 的时候,程序会自动把 0 与后面的数据合并在一起了,至于为什么我还是没搞懂。可能是因为程序中使用了动态存储。我觉得本次实验的难度在于队列的插入,需要用到 InfQueue(q,k)来输出队首插入,InrQueue(q,k);输出队尾的插入。