赞
踩
实验内容:使typedef自定义队列的队头指针 和队列结点
设定有限大小的存储空间
体会循环队列构建,入队,出队代码实现。
使用(Q->reat-Q->fromt+
MAXQSIZE)% MAXQSIZE来解决超出 范围出现负数的情况
2.实验代码:
#include<stdio.h> #include<stdlib.h> #include<malloc.h> #define OVERFLOW -2 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define MAXQSIZE 100 typedef int QElemType; typedef int Status; typedef struct{ QElemType *base; int front; int rear; }SqQueue; //初始化_循环队列 Status InitQueue_II(SqQueue *Q) { Q->base=(QElemType *)malloc(MAXQSIZE * sizeof(QElemType)); if(!Q->base) exit(OVERFLOW); Q->front=Q->rear=0; return OK; } //队列长度 int QueueLength(SqQueue Q) { return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE; } //插入_循环队列 Status EnQueue_II(SqQueue *Q,QElemType &e) { if((Q->rear+1)%MAXQSIZE==Q->front) return FALSE; Q->base[Q->rear]=e; Q->rear=(Q->rear+1)%MAXQSIZE; return OK; } //出队_循环队列 Status DeQueue_II(SqQueue *Q,int &e) { if(Q->rear==Q->front) return ERROR; e=(int)(Q->base[Q->front]); Q->front=(Q->front+1)%MAXQSIZE; return TRUE; } int main() { int i,n,e; SqQueue SQ; InitQueue_II(&SQ); printf("*****************循环队列*****************\n"); printf("请输入要入队的元素个数:"); scanf("%d",&n); printf("请输入%d个元素\n",n); for(i=0;i<n;i++){ scanf("%d",&e); if(!EnQueue_II(&SQ,e)){ printf("入队失败!\n"); break; } } printf("请输入要出队的元素个数:"); scanf("%d",&n); for(i=1;i<=n;i++){ if(!DeQueue_II(&SQ,e)){ printf("队列已空!\n"); break; } printf("第%d个出队的元素为:%d\n",i,e); } printf("队列剩余原数为%d",QueueLength( SQ)); return 0; }
测试结果:(运行结果截图插入)
3.实验分析:(实验中出现的问题,注意的问题以及如何修改的等等)
问题
在刚开始时对MAXQSIZE的定义未理解做什么用,
解决:在后续发现循环队列长度为定值
在插入队列时不知如何插入的队中。
解决:在查找了课件后发现,*base是找到队列的首地址,所以让
Q->base就找到了队头,然后在以这个地址下开辟了MAXQSIZE大小的课件就可以以Q->base[Q->rear]=e的方式插入数据,然后以Q->rear=(Q->rear+1)%MAXQSIZE的方式使队尾指针向前一位循环即可。
在输出时总是只树池第一位数后输出队列以空,有事还是先输出后插入的数字
解决:在int &e 后解决先树池最后一位的问题,应为在出队代码前用 e入队,所以在最后e==最后入队的值,然而在int e 传值时只是不能达到效果。
在检查代码时发现if((Q->rear+1)%MAXQSIZE=Q->front)
return FALSE;的错误=是赋值语句,一旦运行就会赋值,所以改成==就解决了
4.实验心得:(此次实验收获、体会和经验介绍)
发现了规范代码的重要性,不但增加了后期的排查错误,还对其他人进行阅读时提供了方便。收获了循环队列的操作,以及用Q->base[Q->rear]=e的方法
定义使用确定的空间。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。