《数据结构》实验报告学号2015011512姓名胡明禹专业数学与应用数学时间2018.3.20一、实验题目实验4循环队列基本操作二、实验目的1.熟练掌握循环队列的实现和基本操作2.理解队列先进先出的特点3.可以利用队列解决实际问题三、算法设计分析(一)实验内容1.初始化一个空的循环队列2.实现入队操作3.实现出对操作4.输出队列中全部元素5.实现销毁队列操作(二)总体设计此处给出主要函数功能、及函数间调用关系的的描述。例如:①初始化空的循环队列函数②创建一个队函数③入队函数④出队函数⑤计算队中元素个数函数⑥输出函数⑦销毁函数⑧主函数其功能描述如下:(1)主函数:统筹调用各个函数以实现相应功能voidmain()(2)①初始化一个空的循环队列函数StatusInitQueue(SqQueue&Q){system(cls);Q.base=(QElemType*)malloc(MAXSIZE*sizeof(QElemType));if(!Q.base)exit(OVERFLOW);//存储分配失败Q.front=Q.rear=0;printf(成功!\n\n);returnOK;}②创建一个队函数StatusCreateQueue(SqQueue&Q){system(cls);intn;printf(请输入循环队列长度:);scanf(%d,&n);for(inti=1;i=n;i++){printf(第%d个元素为:,i);scanf(%d,&Q.base[Q.rear]);Q.rear=(Q.rear+1)%MAXSIZE;}printf(成功\n\n);returnOK;}③入队函数StatusEnQueue(SqQueue&Q,QElemTypee)//入队操作,插入e为新的队尾元素{if((Q.rear+1)%MAXSIZE==Q.front)returnERROR;//队列满Q.base[Q.rear]=e;Q.rear=(Q.rear+1)%MAXSIZE;printf(成功\n\n);returnOK;}④出队函数StatusDeQueue(SqQueue&Q)//出队操作,若队列不空,则删除Q的队头元素,并输出删除元素的值{system(cls);QElemTypee;if(Q.front==Q.rear)returnERROR;//否则返回errore=Q.base[Q.front];Q.front=(Q.front+1)%MAXSIZE;printf(出队元素是:);printf(%d\n,e);printf(成功\n\n);returnOK;}⑤计算队中元素个数函数StatusQueueLength(SqQueueQ)//计算队中元素个数{system(cls);return(Q.rear-Q.front+MAXSIZE)%MAXSIZE;returnOK;}⑥输出函数StatusPrintQueue(SqQueueQ)//输出队{system(cls);printf(循环队列为::);inti,n;n=QueueLength(Q);for(i=1;i=n;i++){printf(%d,Q.base[Q.front]);Q.front=(Q.front+1)%MAXSIZE;}returnOK;}⑦销毁队函数StatusDestroyQueue(SqQueue&Q)//销毁队Q{system(cls);Q.front=Q.rear=0;free(Q.base);printf(销毁队成功\n\n);returnOK;}四、实验测试结果及结果分析(一)测试结果(此处给出程序运行截图)(二)结果分析成功完成了题目所要求入队,出队等基本操作。五、实验总结附录实验程序代码(该部分请加注释)#includestdio.h#includestdlib.h#includemalloc.h#defineMAXSIZE100//存储空间初始分配量,最大队列长度#defineOVERFLOW-2#defineOK1#defineERROR0typedefintQElemType;typedefintStatus;typedefstruct{QElemType*base;//初始化的动态分配存储空间intfront;//头指针,若队列不空,指向队列头元素intrear;//尾指针,若队列不空,指向队尾元素的下一个位置}SqQueue;StatusInitQueue(SqQueue&Q)//初始化一个空的循环队列{system(cls);Q.base=(QElemType*)malloc(MAXSIZE*sizeof(QElemType));if(!Q.base)exit(OVERFLOW);//存储分配失败Q.front=Q.rear=0;printf(成功!\n\n);returnOK;}StatusCreateQueue(SqQueue&Q)//创建一个队{system(cls);intn;printf(请输入循环队列长度:);scanf(%d,&n);for(inti=1;i=n;i++){printf(第%d个元素为:,i);scanf(%d,&Q.base[Q.rear]);Q.rear=(Q.rear+1)%MAXSIZE;}printf(成功\n\n);returnOK;}StatusEnQueue(SqQueue&Q,QElemTypee)//入队操作,插入e为新的队尾元素{if((Q.rear+1)%MAXSIZE==Q.front)returnERROR;//队列满Q.base[Q.rear]=e;Q.rear=(Q.rear+1)%MAXSIZE;printf(成功\n\n);returnOK;}StatusDeQueue(SqQueue&Q)//出队操作,若队列不空,则删除Q的队头元素,并输出删除元素的值{system(cls);QElemTypee;if(Q.front==Q.rear)returnERROR;//否则返回errore=Q.base[Q.front];Q.front=(Q.front+1)%MAXSIZE;printf(出对元素是:);printf(%d\n,e);printf(成功\n\n);returnOK;}StatusQueueLength(SqQueueQ)//计算队中元素个数{system(cls);return(Q.rear-Q.front+MAXSIZE)%MAXSIZE;returnOK;}StatusPrintQueue(SqQueueQ)//输出队{system(cls);printf(循环队列为::);inti,n;n=QueueLength(Q);for(i=1;i=n;i++){printf(%d,Q.base[Q.front]);Q.front=(Q.front+1)%MAXSIZE;}returnOK;}StatusDestroyQueue(SqQueue&Q)//销毁队Q{system(cls);Q.front=Q.rear=0;free(Q.base);printf(销毁队成功\n\n);returnOK;}voidmainmenu()//输出菜单,供用户进行操作选择{printf(\n菜单);printf(\n**************************\n\n);printf(*1.初始化循环队列*\n);printf(*2.创建队*\n);printf(*3.入队操作*\n);printf(*4.出队操作*\n);printf(*5.输出队*\n);printf(*6.销毁队*\n);printf(*0.退出*\n);printf(\n***************************\n);}voidmain()//主函数{intchoose,e;SqQueueQ;while(1){mainmenu();printf(\n请输入你的选择:);scanf(%d,&choose);switch(choose){case1://在此插入初始化循环队列函数InitQueue(Q);system(PAUSE);system(cls);break;case2://在此插入创建循环队列函数CreateQueue(Q);system(PAUSE);system(cls);break;case3://入队,在此调用入队函数system(cls);printf(请输入进栈元素:);scanf(%d,&e);EnQueue(Q,e);system(PAUSE);system(cls);break;case4://出队,在此调用出队操作函数DeQueue(Q);system(PAUSE);system(cls);break;case5://输出队,在此插入调用输出队函数PrintQueue(Q);printf(\n\n);system(PAUSE);system(cls);break;case6://销毁,在此调用销毁队函数DestroyQueue(Q);system(PAUSE);system(cls);break;case0://退出exit(0);break;default://输入非法,提示用户重新输入printf(\n输入错误,重新输入!\n);}}}