1、链队
#include<stdio.h> #include<malloc.h> #include<assert.h>#define ElemType inttypedef struct QueueNode{ElemType data;struct QueueNode* next; }QueueNode; typedef struct LinkQueue{QueueNode* front;//队头QueueNode* tail;//队尾 }LinkQueue;QueueNode* malloc_QueueNode(ElemType e){QueueNode* node = (QueueNode*)malloc(sizeof(QueueNode));assert(node != NULL);node->data = e;node->next = NULL; }void initQueue(LinkQueue* queue){//构造虚拟头结点QueueNode* p = malloc_QueueNode(-1);queue->front = queue->tail = p; }//入队 void enQueue(LinkQueue* queue,ElemType e){QueueNode* p = malloc_QueueNode(e);queue->tail->next = p;//修改队尾 queue->tail = p; }//出队 int deQueue(LinkQueue* queue){if(queue->front == queue->tail){printf("当前链队为空,不可删除.\n");return;}QueueNode* p = queue->front->next;queue->front->next = p->next;if(p == queue->tail){queue->tail = queue->front;}free(p); }//得到队头元素 void getHead(LinkQueue* queue,ElemType* e){if(queue->front == queue->tail){printf("当前链队为空.\n");return;}QueueNode* p = queue->front->next;*e = p->data; }//长度 int length(LinkQueue* queue){int len = 0;QueueNode* p = queue->front->next;while(p != NULL){p = p->next;len++;}return len; }//清空链队 void clear(LinkQueue* queue){QueueNode* p = queue->front->next;while(p != NULL){queue->front->next = p->next;free(p);p = queue->front->next;}queue->tail = queue->front; }//销毁 void destroy(LinkQueue* queue){clear(queue);free(queue->front);queue->front = queue->tail = NULL; } //打印链队 void showQueue(LinkQueue* queue){QueueNode* p = queue->front->next;while(p != NULL){printf("%d->",p->data);p = p->next;}printf("NULL.\n"); } int main(){LinkQueue queue;initQueue(&queue);int i = 1;for(i;i <= 5;i++){enQueue(&queue,i); }showQueue(&queue);deQueue(&queue);showQueue(&queue);return 0; }
2、顺序队
#include<stdio.h> #include<malloc.h> #include<assert.h>#define ElemType int#define MAXSIZE 8 //顺序队列 typedef struct SeqQueue{ElemType* base;int front;//队头 int rear;//队尾 }SeqQueue;//初始化顺序队列 void initSeqQueue(SeqQueue* Q){Q->base = (ElemType*)malloc(sizeof(ElemType) * MAXSIZE);assert(Q->base != NULL);Q->front = 0;Q->rear = 0; }//入队 void enQueue(SeqQueue* Q,ElemType e){if(Q->rear >= MAXSIZE){printf("队列空间已满,%d 不可入队.\n",e);return;}Q->base[Q->rear++] = e; } //出队 void DeQueue(SeqQueue* Q){if(Q->front == Q->rear){printf("队列为空,不可出队.\n");return;}Q->front++; } //打印队列 void showSeqQueue(SeqQueue* Q){int i = Q->front;for(i;i < Q->rear;i++){printf("%d ",Q->base[i]);}printf("\n"); } void getHead(SeqQueue* Q,ElemType* e){if(Q->front == Q->rear){printf("队列为空,无法获取队头元素.\n");return;}*e = Q->base[Q->front]; }int length(SeqQueue* Q){return Q->rear - Q->front; }void clear(SeqQueue* Q){Q->front = Q->rear = 0; }void destroy(SeqQueue* Q){free(Q->base);Q->base = NULL; } int main(){SeqQueue Q;initSeqQueue(&Q);int i = 1;for(i;i <= 10;i++){enQueue(&Q,i);}showSeqQueue(&Q);DeQueue(&Q);showSeqQueue(&Q);return 0; }
3、循环队列
#include<stdio.h> #include<malloc.h> #include<assert.h>#define ElemType int#define MAXSIZE 8 //顺序队列 typedef struct SeqQueue{ElemType* base;int front;//队头 int rear;//队尾 }SeqQueue;//初始化顺序队列 void initSeqQueue(SeqQueue* Q){Q->base = (ElemType*)malloc(sizeof(ElemType) * MAXSIZE);assert(Q->base != NULL);Q->front = 0;Q->rear = 0; }//入队 void enQueue(SeqQueue* Q,ElemType e){if(((Q->rear + 1) % MAXSIZE) == Q->front){printf("队列空间已满,%d 不可入队.\n",e);return;}Q->base[Q->rear] = e;Q->rear = (Q->rear + 1) % MAXSIZE; } //出队 void DeQueue(SeqQueue* Q){if(Q->front == Q->rear){printf("队列为空,不可出队.\n");return;}Q->front = (Q->front + 1) % MAXSIZE; } //打印队列 void showSeqQueue(SeqQueue* Q){int i = Q->front;for(i;i != Q->rear;i = (i + 1) % MAXSIZE){printf("%d ",Q->base[i]);}printf("\n"); } void getHead(SeqQueue* Q,ElemType* e){if(Q->front == Q->rear){printf("队列为空,无法获取队头元素.\n");return;}*e = Q->base[Q->front]; }int length(SeqQueue* Q){return Q->rear - Q->front; }void clear(SeqQueue* Q){Q->front = Q->rear = 0; }void destroy(SeqQueue* Q){free(Q->base);Q->base = NULL; } int main(){SeqQueue Q;initSeqQueue(&Q);int i = 1;for(i;i <= 10;i++){enQueue(&Q,i);}showSeqQueue(&Q);DeQueue(&Q);showSeqQueue(&Q);return 0; }
注:上诉使用空一个空间来方便判断空和判满,如果不想浪费这一个空间,可通过设置一个标志位来用于判空和判满。