#include <stdio.h> #include <stdlib.h> #define MAXSIZE 6 typedef int QElemType; typedef struct { QElemType *base; int front; int rear; }SqQueue; SqQueue *InitQueue(SqQueue* Q);//初始化 SqQueue *DestroyQueue(SqQueue* Q);//销毁 void ClearQueue(SqQueue *Q);//清空 int QueueEmpty(SqQueue *Q);//判空 int QueueLength(SqQueue *Q);//队列长度 QElemType GetHead(SqQueue *Q);//获取队头元素 int EnQueue(SqQueue *Q, QElemType e);//插入新元素到队尾 int DeQueue(SqQueue *Q, QElemType *e);//删除队头元素 void QueueTraverse(SqQueue *Q);//遍历 //初始化 SqQueue *InitQueue(SqQueue* Q){ Q = (SqQueue *)malloc(sizeof(SqQueue)); Q->base = (QElemType *)malloc(sizeof(QElemType)*MAXSIZE); if(!Q->base){ printf("空间不足,初始化失败 "); return NULL; } Q->front=Q->rear=0; printf("初始化成功 "); return Q; } //销毁 SqQueue *DestroyQueue(SqQueue* Q){ free(Q->base); free(Q); printf("销毁成功 "); return NULL; } //清空 void ClearQueue(SqQueue *Q){ int i=Q->front; while(i%MAXSIZE != Q->rear){ printf("%d被清空 ",Q->base[i%MAXSIZE]); Q->base[i%MAXSIZE] = 0; i++; } printf("清空成功 "); } //判空,1为空 int QueueEmpty(SqQueue *Q){ return(Q->rear == Q->front); } //返回队列长度 int QueueLength(SqQueue *Q){ return (Q->rear-Q->front+MAXSIZE)%MAXSIZE; } //获取队头元素 QElemType GetHead(SqQueue *Q){ if(Q->front != Q->rear){ printf("队头元素是%d ", Q->base[Q->front]); return Q->base[Q->front]; }else{ printf("空队列,无队头 "); } } //插入新元素到队尾,返回是否入队成功的状态 int EnQueue(SqQueue *Q, QElemType e){ //判定是否还有一个空 if((Q->rear+1)%MAXSIZE == Q->front){ printf("队列已满,%d元素入队失败 ",e); return 0; } Q->base[Q->rear] = e; //插入后尾指针加一 Q->rear = (Q->rear+1)%MAXSIZE; printf("%d入队成功 ", e); return 1; } //删除队头元素 int DeQueue(SqQueue *Q, QElemType *e){ //判空 if(Q->front==Q->rear){ printf("空队列,删除失败 "); return 0; } *e = Q->base[Q->front]; Q->front=(Q->front+1)%MAXSIZE; printf("%d元素出队成功 ", *e); return 1; } //遍历 void QueueTraverse(SqQueue *Q){ if(QueueEmpty(Q)){ printf("空队列 "); return; } int i=Q->front; //只要不等于尾指针就一直遍历 while(i%MAXSIZE != Q->rear){ printf("%d ",Q->base[i%MAXSIZE]); i++; } printf(" "); } int main(void) { SqQueue *Q = NULL; QElemType e = NULL; //初始化测试 Q = InitQueue(Q); //遍历测试 QueueTraverse(Q); // //入队测试 // EnQueue(Q, 1); // EnQueue(Q, 2); // EnQueue(Q, 3); // EnQueue(Q, 4); // QueueTraverse(Q); // //长度测试 // printf("队列长度为%d ",QueueLength(Q)); // EnQueue(Q, 1); // EnQueue(Q, 2); // EnQueue(Q, 3); // EnQueue(Q, 4); // printf("队列长度为%d ",QueueLength(Q)); // EnQueue(Q, 5); // EnQueue(Q, 6); // printf("队列长度为%d ",QueueLength(Q)); // //出队测试 // DeQueue(Q, &e); // printf("测试e是否改变:%d ",e); // QueueTraverse(Q); // //获取队头元素测试 // e = GetHead(Q); // EnQueue(Q, 999); // e = GetHead(Q); // //出入测试 // EnQueue(Q, 1); // EnQueue(Q, 3); // EnQueue(Q, 5); // EnQueue(Q, 7); // EnQueue(Q, 9); // EnQueue(Q, 11); // QueueTraverse(Q); // DeQueue(Q, &e); // DeQueue(Q, &e); // DeQueue(Q, &e); // QueueTraverse(Q); // EnQueue(Q, 7); // EnQueue(Q, 9); // EnQueue(Q, 11); // EnQueue(Q, 13); // QueueTraverse(Q); // //清空测试 // EnQueue(Q, 7); // EnQueue(Q, 9); // EnQueue(Q, 11); // EnQueue(Q, 13); // ClearQueue(Q); // QueueTraverse(Q); //销毁测试 EnQueue(Q, 7); EnQueue(Q, 9); EnQueue(Q, 11); EnQueue(Q, 13); Q = DestroyQueue(Q); QueueTraverse(Q); return 0; }