/****************************************************** File name: LinkQueue.c Description: 队列链式存储的操作的实现 Author: MusaGeek Version: 1.0 Date: 2018-11-26 Function List: ******************************************************/ #include <stdio.h> #include <stdlib.h> #include "LinkQueue.h" /************************************************* Function: InitQueue Description: 初始化链式队列 创建链表的头结点 , 将front 和 rear 均指向头结点。 Input: Q: 指向链式队列的指针 Return: BOOL TRUE : 初始化成功 FALSE : 初始化失败 *************************************************/ BOOL InitQueue(LinkQueue *Q) { Q->front = (QueuePtr)malloc(sizeof(QNode)); if(!Q->front) return FALSE; Q->front->next = NULL; Q->rear = Q->front; } /************************************************* Function: EnQueue Description: 将元素插入队列 1.创建一个新结点 , 将e 赋值给结点的data 2.将创建的结点增加的链表的尾部 3.尾指针指向创建的结点 4.返回TRUE Input: Q: 指向链式队列的指针 Return: BOOL TRUE : 插入成功 FALSE : 插入失败 *************************************************/ BOOL EnQueue(LinkQueue *Q, QElemType e) { QueuePtr node = (QueuePtr)malloc(sizeof(QNode)); if(!node) return FALSE; node->data = e; node->next = NULL; Q->rear->next = node; /*将node结点插入链表尾部*/ Q->rear = node; /*将尾指针指向node*/ return TRUE; } /************************************************* Function: DeQueue Description: 头元素出队列 1.判断队列是否为空 , 为空 返回 FALSE 2.将头结点的 next 指向存放首元素的结点node的下一个结点 3.node结点的data通过e传出 4.若rear为node , 说明删除node以后队列为空 , 应该将rear 指向 front 5.释放node 6.返回TRUE Input: Q: 指向链式队列的指针 Output: e : 通过e传出首元素的值 Return: BOOL TRUE : 出队列成功 FALSE : 出队列失败 *************************************************/ BOOL DeQueue(LinkQueue *Q, QElemType *e) { if(Q->front == Q->rear) /*判断队列是否为空*/ return FALSE; QueuePtr node = Q->front->next; Q->front->next = node->next; /*从队列中删除node结点*/ if(Q->rear == node) /*判断是否队列删除node以后为空队列*/ Q->rear = Q->front; /*若为空队列,rear 指针 指向 front 指针指向的位置*/ *e = node->data; /*node结点的值传出, 完成出队列操作*/ free(node); return TRUE; } |