CoolPotOS/data/queue.c

59 lines
1.4 KiB
C
Raw Normal View History

2024-04-09 23:46:56 +08:00
#include "../include/queue.h"
#include "../include/memory.h"
#include "../include/vga.h"
#include "../include/io.h"
Queue *create_queue() {
Queue *queue = (Queue *) kmalloc(sizeof(Queue));
queue->phead = NULL;
queue->ptail = NULL;
queue->size = 0;
return queue;
}
void free_queue(Queue *queue) {
QNode *cur = queue->phead;
while (cur) {
QNode *next = cur->next;
kfree(cur);
cur = next;
}
queue->phead = queue->ptail = NULL;
kfree(queue);
}
void queue_push(Queue *pq, char x) {
QNode *newnode = (QNode *) kmalloc(sizeof(QNode));//为新节点申请内存空间
if (newnode == NULL) {
printf("OUT_OF_MEMORY: The kernel memory out of.");
io_cli();
for (;;)io_hlt();
}
newnode->data = x; //新节点储存数据
newnode->next = NULL;//新节点的下一个指向NULL即新节点作为队尾
if (pq->phead == NULL)//将新节点入队
{
pq->phead = pq->ptail = newnode;
pq->phead->next = newnode;
} else {
pq->ptail->next = newnode;
pq->ptail = newnode;
}
pq->size++;
}
char queue_pop(Queue *pq) {
if (pq->size == 0)return NULL;
QNode *next = pq->phead->next;
kfree(pq->phead);
pq->phead = next;
if (pq->phead == NULL) {
pq->ptail = NULL;
}
pq->size -= 1;
return next->data;
}