C语言-手写任务队列

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);
}


在这里插入图片描述

点赞 -收藏-关注-便于以后复习和收到最新内容
有其他问题在评论区讨论-或者私信我-收到会在第一时间回复
在本博客学习的技术不得以任何方式直接或者间接的从事违反中华人民共和国法律,内容仅供学习、交流与参考
免责声明:本文部分素材来源于网络,版权归原创者所有,如存在文章/图片/音视频等使用不当的情况,请随时私信联系我、以迅速采取适当措施,避免给双方造成不必要的经济损失。
感谢,配合,希望我的努力对你有帮助^_^

猜你喜欢

转载自blog.csdn.net/weixin_45203607/article/details/126805557