循环队列的相关操作
2013-10-14 19:20
489 查看
循环队列的相关操作
#include<stdio.h> #include<stdlib.h> #include<malloc.h> #define MAXQSIZE 100 #define OK 1 #define ERROR 0 #define True 1 #define False 0 #define OVERFLOW -1 typedef int Status; typedef struct { int *base; int front; int rear; }SqQueue; //构建循环队列 Status InitQueue(SqQueue *Q) { Q->base=(int *)malloc(MAXQSIZE*sizeof(int)); if(!Q->base) exit(OVERFLOW); Q->front=Q->rear=0; return OK; } //插入操作 Status EnQuenu(SqQueue *Q,int e) { if((Q->rear+1)%MAXQSIZE==Q->front)//判断队列是否已满 return ERROR; Q->base[Q->rear]=e; //插入元素 ,队列的插入只能从队尾 Q->rear=(Q->rear+1)%MAXQSIZE;//rear后移 return OK; } //删除操作 Status DeQueue(SqQueue *Q) { if(Q->front==Q->rear) //判断是否为空队列 return ERROR; Q->front=(Q->front+1)%MAXQSIZE;//将front向后边移动,队列的删除只能从队头 return OK; } //向队列中传入数据 Status PasQueue(SqQueue *Q,int n) { int i; if(n>MAXQSIZE) return ERROR; else { Q->front=Q->rear=0; for(i=0;i<n;i++) { printf("base[%d]=",i); scanf("%d",&Q->base[i]); Q->rear++; } } return OK; } Status SqQueueTrave(SqQueue Q) { if(Q.front==Q.rear) return ERROR; int i; if(Q.front>Q.rear) //若Q.front<Q.rear { for(i=Q.front;i<MAXQSIZE;i++) { if(!Q.base[i]) continue; printf("%4d",Q.base[i]); } for(i=0;i<Q.rear;i++) printf("%4d",Q.base[i]); } else //若Q.front>Q.rear { for(i=Q.front;i<Q.rear;i++) printf("%4d",Q.base[i]); } printf("\n"); } int main() { int n,e; char c; SqQueue Q; InitQueue(&Q); printf("\n 1.队列的初始化\n 2.插入元素\n 3.删除元素\n 4.退出\n请输入你的选择\n"); while(c!='0') { scanf("%c",&c); switch(c) { case'1': printf("输入首次向队列传入数据的长度:"); scanf("%d",&n); PasQueue(&Q,n); SqQueueTrave(Q); break; case'2': printf("请输入插入的元素:"); scanf("%d",&e); EnQuenu(&Q,e); SqQueueTrave(Q); break; case'3': DeQueue(&Q); SqQueueTrave(Q); break; case'0': exit(0); default: break; } } system("pause"); }