}ADT Queue
队列有两种实现方法
1. 循环队列
先看看它的原理
进而得到它的代码如下
#include<stdio.h> #include<stdlib.h> #define MAXQSIZE 100//队列的最大长度 #define FALSE 0 #define TRUE 1 #define ERROR -1 #define OVERFLOW -1 #define OK 1 typedef int QElemType; typedef int Status; typedef struct{ QElemType *base; int front;//头指针,若队列不空,指向队列头元素 int rear;//尾指针,若队列不空,指向队列尾元素的下一个位置 }SqQueue; //循环队列的基本操作实现 Status InitQueue(SqQueue*Q) { Q->base=(QElemType*)malloc(MAXQSIZE*sizeof(QElemType)); if(!Q->base) return ERROR; Q->front=Q->rear=0; } Status DestroyQueue(SqQueue* Q) { free(Q->base); Q->base=NULL; Q->front=Q->rear=0; return OK; } Status ClearQueue(SqQueue*Q) { Q->front=Q->rear=0; return OK; } Status QueueEmpty(SqQueue Q) { if(Q.front==Q.rear) return TRUE; else return FALSE; } int QueueLength(SqQueue Q) { return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE; } Status GetHead(SqQueue Q,QElemType *e) { *e=Q.base[Q.front]; return OK; } Status EnQueue(SqQueue* Q,QElemType e) { if((Q->rear+1)%MAXQSIZE==Q->front) return ERROR;//判断是否满队列 Q->base[Q->rear]=e; Q->rear=(Q->rear+1)%MAXQSIZE; return OK; } Status DeQueue(SqQueue *Q,QElemType *e) { if(Q->front==Q->rear) return ERROR; *e=Q->base[Q->front]; Q->front=(Q->front+1)%MAXQSIZE; return OK; } 2. 链队列
代码如下:
#include<stdio.h> #include<stdlib.h> #define FALSE 0 #define TRUE 1 #define ERROR -1 #define OVERFLOW -1 #define OK 1 typedef int QElemType; typedef int Status; typedef struct QNode{ QElemType data; struct QNode*next; }QNode; typedef struct{ QNode *front;//头指针 QNode * rear;//尾指针, }LinkQueue; //链队列的基本操作实现 Status InitQueue(LinkQueue*Q) { Q->front=Q->rear=(QNode*)malloc(sizeof(QNode)); if(!Q->front) return ERROR; Q->front->next=NULL; } Status DestroyQueue(LinkQueue* Q) { while(Q->front) { Q->rear=Q->front->next; free(Q->front); Q->front=Q->rear; } return OK; } Status ClearQueue(LinkQueue*Q) { QNode *p=Q->front->next,*q; while(p) { q=p->next; free(p); p=q; } Q->rear=Q->front; Q->front->next=NULL; return OK; } Status QueueEmpty(LinkQueue Q) { if(Q.front==Q.rear) return TRUE; else return FALSE; } int QueueLength(LinkQueue Q) { int i=0; QNode* p=Q.front->next; while(p) { i++; p=p->next; } return i; } Status GetHead(LinkQueue Q,QElemType *e) { *e=Q.front->next->data; return OK; } Status EnQueue(LinkQueue* Q,QElemType e) { QNode*s; s=(QNode*)malloc(sizeof(QNode)); if(!s) return ERROR; s->data=e; s->next=NULL; Q->rear->next=s; Q->rear=s; return OK; } Status DeQueue(LinkQueue *Q,QElemType *e) { QNode*p; if(Q->front==Q->rear) return ERROR; p=Q->front->next; *e=p->data; Q->front->next=p->next; if(Q->rear==p) Q->rear=Q->front; free(p); return OK; }