C语言-手写任务队列
文章目录
基本概念
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)
入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头
队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低需要挪动数据O(N)。而链表结构头删只需要O(1)。尾插定义一个尾指针,也只需要O(1)。
头文件
#ifndef STUDY_TASK_QUEUE_H
#define STUDY_TASK_QUEUE_H
//任务结构体
typedef struct Task
{
void (*function)(void* arg);
void* arg;
}Task;
typedef struct QueueNode
{
struct QueueNode* next;
Task *task; //任务
}QNode;
typedef struct Queue//
{
QNode* head;//头指针
QNode* tail;//尾指针
int size;//队列大小
}Queue;
Queue* createQueue();
void enqueue(Queue* queue, Task* task);
Task* dequeue(Queue* queue);
int getQueueSize(Queue* queue);
int isQueueEmpty(Queue* queue);
Task* getQueueHead(Queue* queue);
Task* getQueueTail(Queue* queue);
void clearQueue(Queue* queue);
void destroyQueue(Queue* queue);
#endif //STUDY_TASK_QUEUE_H
队列实现
//
// Created by Administrator on 2022/9/11.
//
#include "task_queue.h"
#include <malloc.h>
#include <stdio.h>
//其操作特性为先进先出,并且只允许在队尾进,队头出。
//创建任务队列
Queue* createQueue(){
Queue* queue = (Queue*)malloc(sizeof(Queue));
queue->head = NULL;
queue->tail = NULL;
queue->size= 0;
return queue;
}
//任务入队列
void enqueue(Queue* queue, Task* task){
QNode* node = (QNode*)malloc(sizeof(QNode));
node->task = task;
node->next = NULL;
if(queue->head == NULL){
queue->head = node;
queue->tail = node;
}else{
queue->tail->next = node;
queue->tail = node;
}
queue->size++;
}
//任务出队列
Task* dequeue(Queue* queue){
if(queue->head == NULL){
return NULL;
}
QNode* node = queue->head;
Task* task = node->task;
queue->head = node->next;
if(queue->head == NULL){
queue->tail = NULL;
}
free(node);
queue->size--;
return task;
}
//获取队列大小
int getQueueSize(Queue* queue){
return queue->size;
}
//判断队列是否为空
int isQueueEmpty(Queue* queue){
return queue->size == 0;
}
//获取队列头
Task* getQueueHead(Queue* queue){
if(queue->head == NULL){
return NULL;
}
return queue->head->task;
}
//获取队列尾
Task* getQueueTail(Queue* queue){
if(queue->tail == NULL){
return NULL;
}
return queue->tail->task;
}
//清空队列
void clearQueue(Queue* queue){
while(queue->head != NULL){
QNode* node = queue->head;
queue->head = node->next;
free(node);
}
queue->tail = NULL;
queue->size = 0;
}
//销毁队列
void destroyQueue(Queue* queue){
QNode* node = queue->head;
while(node != NULL){
QNode* temp = node;
node = node->next;
free(temp);
}
free(queue);
}