HW_Lib/lib/list/queue.cpp

145 lines
3.4 KiB
C++
Raw Permalink Normal View History

2024-06-21 05:25:07 +00:00
#include <cstdlib>
#include <cassert>
2024-06-21 07:21:42 +00:00
#include <cstring>
#include <cstdio>
2024-06-21 05:25:07 +00:00
#include "queue.h"
2024-06-21 07:21:42 +00:00
static Queue_Node_t *newQueue_Node_t(void *data, unsigned char size) {
Queue_Node_t *node = (Queue_Node_t *) malloc(sizeof(Queue_Node_t));
node->val = malloc(size);
2024-06-21 05:25:07 +00:00
node->next = NULL;
node->prev = NULL;
2024-06-21 07:21:42 +00:00
if (node->val == NULL) {
printf("Error allocating memory");
return NULL;
}
memcpy(node->val, data, size);
2024-06-21 05:25:07 +00:00
return node;
}
/* 析构函数 */
2024-06-21 07:21:42 +00:00
static void delQueue_Node_t(Queue_Node_t *node) {
free(node->val);
2024-06-21 05:25:07 +00:00
free(node);
}
/* 构造函数 */
2024-06-21 07:21:42 +00:00
Queue_List_t *newQueue_List(unsigned char size) {
Queue_List_t *deque = (Queue_List_t *) malloc(sizeof(Queue_List_t));
2024-06-21 05:25:07 +00:00
deque->front = NULL;
deque->rear = NULL;
deque->queSize = 0;
2024-06-21 07:21:42 +00:00
deque->typeSize = size;
2024-06-21 05:25:07 +00:00
return deque;
}
/* 析构函数 */
2024-06-21 07:21:42 +00:00
void delQueue_List(Queue_List_t *deque) {
2024-06-21 05:25:07 +00:00
// 释放所有节点
for (int i = 0; i < deque->queSize && deque->front != NULL; i++) {
2024-06-21 07:21:42 +00:00
Queue_Node_t *tmp = deque->front;
2024-06-21 05:25:07 +00:00
deque->front = deque->front->next;
2024-06-21 07:21:42 +00:00
delQueue_Node_t(tmp);
2024-06-21 05:25:07 +00:00
}
// 释放 deque 结构体
free(deque);
}
/* 获取队列的长度 */
2024-06-21 07:21:42 +00:00
int queue_size(Queue_List_t *deque) {
2024-06-21 05:25:07 +00:00
return deque->queSize;
}
/* 判断队列是否为空 */
2024-06-21 07:21:42 +00:00
bool queue_is_empty(Queue_List_t *deque) {
2024-06-21 05:25:07 +00:00
return (queue_size(deque) == 0);
}
/* 入队 */
2024-06-21 07:21:42 +00:00
static void push(Queue_List_t *deque, void *data, bool isFront) {
Queue_Node_t *node = newQueue_Node_t(data, deque->typeSize);
if (node == NULL) {
printf("Error creating new node");
return;
}
2024-06-21 05:25:07 +00:00
if (queue_is_empty(deque)) {
deque->front = deque->rear = node;
2024-06-21 07:21:42 +00:00
} else if (isFront) {
2024-06-21 05:25:07 +00:00
deque->front->prev = node;
node->next = deque->front;
2024-06-21 07:21:42 +00:00
deque->front = node;
} else {
2024-06-21 05:25:07 +00:00
deque->rear->next = node;
node->prev = deque->rear;
deque->rear = node;
}
2024-06-21 07:21:42 +00:00
deque->queSize++;
2024-06-21 05:25:07 +00:00
}
/* 队首入队 */
2024-06-21 07:21:42 +00:00
void pushFirst(Queue_List_t *deque, void *data) {
2024-06-21 05:25:07 +00:00
push(deque, data, true);
}
/* 队尾入队 */
2024-06-21 07:21:42 +00:00
void pushLast(Queue_List_t *deque, void *data) {
2024-06-21 05:25:07 +00:00
push(deque, data, false);
}
/* 访问队首元素 */
2024-06-21 07:21:42 +00:00
void *peekFirst(Queue_List_t *deque) {
2024-06-21 05:25:07 +00:00
assert(queue_size(deque) && deque->front);
return deque->front->val;
}
/* 访问队尾元素 */
2024-06-21 07:21:42 +00:00
void *peekLast(Queue_List_t *deque) {
2024-06-21 05:25:07 +00:00
assert(queue_size(deque) && deque->rear);
return deque->rear->val;
}
/* 出队 */
2024-06-21 07:21:42 +00:00
static void *pop(Queue_List_t *deque, bool isFront) {
2024-06-21 05:25:07 +00:00
if (queue_is_empty(deque))
2024-06-21 07:21:42 +00:00
return NULL;
void *val = malloc(deque->typeSize);
if (val == nullptr) {
printf("Error allocating memory");
return NULL;
}
2024-06-21 05:25:07 +00:00
if (isFront) {
2024-06-21 07:21:42 +00:00
memcpy(val, deque->front->val, deque->typeSize);
Queue_Node_t *fNext = deque->front->next;
2024-06-21 05:25:07 +00:00
if (fNext) {
fNext->prev = NULL;
deque->front->next = NULL;
}
2024-06-21 07:21:42 +00:00
delQueue_Node_t(deque->front);
deque->front = fNext;
} else {
memcpy(val, deque->rear->val, deque->typeSize);
Queue_Node_t *rPrev = deque->rear->prev;
2024-06-21 05:25:07 +00:00
if (rPrev) {
rPrev->next = NULL;
deque->rear->prev = NULL;
}
2024-06-21 07:21:42 +00:00
delQueue_Node_t(deque->rear);
deque->rear = rPrev;
2024-06-21 05:25:07 +00:00
}
2024-06-21 07:21:42 +00:00
deque->queSize--;
2024-06-21 05:25:07 +00:00
return val;
}
/* 队首出队 */
2024-06-21 07:21:42 +00:00
void *popFirst(Queue_List_t *deque) {
2024-06-21 05:25:07 +00:00
return pop(deque, true);
}
/* 队尾出队 */
2024-06-21 07:21:42 +00:00
void *popLast(Queue_List_t *deque) {
2024-06-21 05:25:07 +00:00
return pop(deque, false);
}