资源描述:
《可扩充循环队列头文件与主程序》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、可扩充循环队列头文件与主程序//可扩充循环队列头文件.h#defineTRUE1#defineFALSE0#defineOK1#defineERROR0#defineNULL0#defineINFEASIBLE-1#defineOVERFLOW-2typedefintStatus;//可扩充循环队列--队列的顺序存储结构#defineMAXSIZE5//队列初始分配元素#defineQUEUEINCREMENT2//存储增typedefstruct{QElemType*base;//初始化的动态
2、分配存储空间intfront;//头指针,若队列不空,指向队队头元素intrear;//尾指针,若队列不空,指向队队尾元素的下一个位置intqueuesize;//当前已分配的空间}SqQueue;/*约定:1.队列尾指针为实际末尾无素的下一位置.2.浪费一个元素空间,以"队列头指针在队列尾指针的下一位置(指环状的下一位置)上作为队列呈"满"状态的标志.Q为空循环队列的判定条件为:头尾重合Q.front==Q.rearQ为满循环队列的判定条件为:队尾赶上队头(Q.rear+1)%MAXSIZE=
3、=Q.front*/StatusInitQueue(SqQueue&Q){//1.构造一个空队列QQ.base=(QElemType*)malloc(MAXSIZE*sizeof(QElemType));if(!Q.base)exit(OVERFLOW);//存储分配失败Q.front=Q.rear=NULL;Q.queuesize=MAXSIZE;returnOK;}StatusDestroyQueue(SqQueue&Q){//2.销毁队列Q,Q不再存在free(Q.base);Q.base
4、=NULL;Q.front=Q.rear=NULL;Q.queuesize=0;returnOK;}StatusClearQueue(SqQueue&Q){//3.清空队列QQ.rear=Q.front=0;returnOK;}4intQueueLength(SqQueueQ){//4.返回Q的元素个数,即队列的长度return(Q.rear-Q.front+Q.queuesize)%Q.queuesize;}StatusQueueEmpty(SqQueueQ){//5.判循环队列空if(Q.f
5、ront==Q.rear)returnTRUE;//队列空elsereturnERROR;}StatusGetHead(SqQueueQ,QElemType&e){//6.若队列不空,则用e返回Q的队头元素,并返回OK,否则返回ERRORif(Q.front==Q.rear)returnERROR;//队列空e=Q.base[Q.front];returnOK;}StatusEnQueue(SqQueue&Q,QElemTypee){//7.插入元素e为Q的新的队尾元素if((Q.rear+1)
6、%Q.queuesize==Q.front)//队列满.队尾赶上队头{Q.base=(QElemType*)realloc(Q.base,(Q.queuesize+QUEUEINCREMENT)*sizeof(QElemType));if(!Q.base)exit(OVERFLOW);//存储分配失败if(Q.front>Q.rear)//队头指针在队尾指针之前增加空间破坏了原来的循环关系for(inti=Q.queuesize-1;i>=Q.front;i--)Q.base[i+QUEUEIN
7、CREMENT]=Q.base[i];//将原队列最末存储单元至队头元素依次后移使其重新保持循环关系Q.front+=QUEUEINCREMENT;//队头指针后移Q.queuesize+=QUEUEINCREMENT;//队空间大小增加}Q.base[Q.rear]=e;//元素插入新的队尾Q.rear=(Q.rear+1)%Q.queuesize;//循环队列队尾指针后移一个位置returnOK;}StatusDeQueue(SqQueue&Q,QElemType&e){//8.若队列不空,
8、则删除Q的队头元素,用e返回其值,并返回OK,否则返回ERRORif(Q.front==Q.rear)returnERROR;//队列空e=Q.base[Q.front];//队头元素赋给eQ.front=(Q.front+1)%Q.queuesize;//循环队列队头指针后移一个位置returnOK;}StatusQueueTraverse(SqQueue&Q,void(*visit)(QElemTypee)){//9.遍历队列,从头到尾依次对每个元素调用函数visit()inti=Q.fro