今天学习了队列,因为前面写了好几个链表实现的数据结构基本上都懂了,然后大致了解了一下队列的特点,便决定用自己的理解来实现一个,然后实现了。
(2018-02-14 代码更新)
Head file:
#ifndef __LINKQUEUE_H_ #define __LINKQUEUE_H_ #define bool int #define true 1 #define false 0 typedef int KeyType; typedef struct node { struct node * next; KeyType key; }Node; typedef struct queue { Node * front; Node * rear; int nums; }Queue; Queue * CreateLinkQueue(); bool QueueIsEmpty(); int QueueItemCount(); bool QueueAdd(); bool QueueRemove(); Node* GetQueueFrontNode(); Node* GetQueueRearNode(); KeyType GetQueueFront(); KeyType GetQueueRear(); void TraverseQueue(); void Clear(); void Destroy(); #endif
LinkQueue.c:
#include <stdio.h> #include <conio.h> #include <stdlib.h> #include "lqueue.h" //建立链队 Queue * CreateLinkQueue(void) { Queue * p; p = (Queue*)malloc(sizeof(Queue)); p->front = p->rear = NULL; p->nums = 0; return p; } //判断队列是否为空 bool QueueIsEmpty(Queue * p) { return p->nums == 0; } //返回当前队列个数 int QueueItemCount(Queue * p) { return p->nums; } //入队 bool QueueAdd(Queue * p, KeyType DATA) { Node * s; s = (Node*)malloc(sizeof(Node)); s->key = DATA; s->next = NULL; if(QueueIsEmpty(p)) p->front = s; else p->rear->next = s; p->rear = s; p->nums++; return true; } //出队 bool QueueRemove(Queue * p) { Node * s; if(QueueIsEmpty(p)) return false; s = p->front; p->front = p->front->next; free(s); p->nums--; return true; } //返回队首节点 Node* GetQueueFrontNode(Queue * p) { if(QueueIsEmpty(p)) return false; return p->front; } //返回队尾节点 Node* GetQueueRearNode(Queue * p) { if(QueueIsEmpty(p)) return false; return p->rear; } //返回队首 KeyType GetQueueFront(Queue * p) { return GetQueueFrontNode(p)->key; } //返回队尾 KeyType GetQueueRear(Queue * p) { return GetQueueRearNode(p)->key; } //遍历队列 void TraverseQueue(Queue * p) { Node*s = GetQueueFrontNode(p); while(s != NULL) { printf("%d ", s->key); s = s->next; } printf(" "); } //清空队列 void Clear(Queue * p) { while(!QueueIsEmpty(p)) QueueRemove(p); } //销毁队列 void Destroy(Queue * p) { if(p != NULL) { Clear(p); free(p); p = NULL; } }