2.6 获取队列头部元素
QDataType QueueFront(Queue* q) { assert(q); assert(!QueueEmpty(q)); return q->_front->_data; }
2.7 获取队列尾部元素
QDataType QueueBack(Queue* q) { assert(q); assert(!QueueEmpty(q)); return q->_rear->_data; } 2.8 获取队列中有效元素个数 int QueueSize(Queue* q) { assert(q); return q->size; }
2.8 销毁队列
void QueueDestroy(Queue* q) { assert(q); QNode* cur=q->_front; while (cur) { QNode* next = cur->_pNext; free(cur); cur = next; } q->size = 0; q->_front = q->_rear = NULL; }
以上三个功能逻辑上比较简单,我就不加以讲解了,这里的销毁队列的逻辑是从队头指针开始,用一个单指针不断循环,对队列进行删除在删除的过程中我们也需要记录需要删除的节点的下一个位置,以免删除后访问不到后续队列的元素,在删除所有元素后我们需要把记录元素的个数的变量,以及队头、队尾指针全部置空。
3.0 代码逻辑测试
void text1() { Queue qe;//创建队列 QueueInit(&qe); QueuePush(&qe, 1); QueuePush(&qe, 2); QueuePush(&qe, 3); QueuePush(&qe, 4); QueuePush(&qe, 5); while (!QueueEmpty(&qe)) { printf("%d ", QueueFront(&qe)); QueuePop(&qe); } QueueDestroy(&qe); } int main() { text1(); return 0; }
这里我们依次插入1,2,3,4,5,然后我们依次打印且删除队头元素,这里我们的到的结果是1 2 3 4 5 。
这里看一下运行结果:
总代码:
Queue.h #include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<assert.h> typedef int QDataType; typedef struct QListNode { struct QListNode* _pNext; QDataType _data; }QNode; // 队列的结构 typedef struct Queue { QNode * _front; QNode* _rear; int size; }Queue; // 初始化队列 void QueueInit(Queue* q); // 队尾入队列 void QueuePush(Queue* q, QDataType data); // 队头出队列 void QueuePop(Queue* q); // 获取队列头部元素 QDataType QueueFront(Queue* q); // 获取队列队尾元素 QDataType QueueBack(Queue* q); // 获取队列中有效元素个数 int QueueSize(Queue* q); // 检测队列是否为空,如果为空返回非零结果,如果非空返回0 bool QueueEmpty(Queue* q); // 销毁队列 void QueueDestroy(Queue* q);
Queue.c
#include"Queue.h" void QueueInit(Queue* q) { assert(q); q->_front = q->_rear = NULL; q->size = 0; } void QueuePush(Queue* q, QDataType data) { assert(q); QNode* newnode = (QNode*)malloc(sizeof(QNode)); if (newnode == NULL) { perror("malloc fail"); return; } newnode->_pNext = NULL; newnode->_data = data; if (q->_front == NULL) { assert(q->_rear == NULL); q->_rear=q->_front = newnode; } else { q->_rear->_pNext = newnode; q->_rear = newnode; } q->size++; } bool QueueEmpty(Queue* q) { assert(q); return q->size == 0; } void QueuePop(Queue* q) { assert(q); assert(!QueueEmpty(q)); if (q->_front == q->_rear) { free(q->_front); q->_front = NULL; q->_rear == NULL; } else { QNode* next = q->_front->_pNext; free(q->_front); q->_front = next; } q->size--; } int QueueSize(Queue* q) { assert(q); return q->size; } QDataType QueueFront(Queue* q) { assert(q); assert(!QueueEmpty(q)); return q->_front->_data; } QDataType QueueBack(Queue* q) { assert(q); assert(!QueueEmpty(q)); return q->_rear->_data; } void QueueDestroy(Queue* q) { assert(q); QNode* cur=q->_front; while (cur) { QNode* next = cur->_pNext; free(cur); cur = next; } q->size = 0; q->_front = q->_rear = NULL; } text.c #include"Queue.h" void text1() { Queue qe; QueueInit(&qe); QueuePush(&qe, 1); QueuePush(&qe, 2); QueuePush(&qe, 3); QueuePush(&qe, 4); QueuePush(&qe, 5); while (!QueueEmpty(&qe)) { printf("%d ", QueueFront(&qe)); QueuePop(&qe); } QueueDestroy(&qe); } int main() { text1(); return 0; }