C言語は汎用キューを作成します

キューはかなり頻繁に使用されています。これはバックアップです。このコードは人工知能によって書かれています。非常に優れています。

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define QUEUE_SIZE 10  // 定义队列的大小

// 定义队列中的元素
typedef struct {
    
    
    void *data;  // 用 void * 存储泛型元素
    size_t size;  // 存储元素的大小
} QueueElement;

// 定义队列
typedef struct {
    
    
    QueueElement *elements;  // 存储队列中的元素
    size_t size;  // 存储队列的大小
    size_t front;  // 存储队列的头
    size_t rear;  // 存储队列的尾
} Queue;

// 创建队列
Queue *createQueue(size_t size) {
    
    
    Queue *queue = (Queue *) malloc(sizeof(Queue));  // 为队列分配内存
    queue->elements = (QueueElement *) malloc(sizeof(QueueElement) * size);  // 为队列中的元素分配内存
    queue->size = size;  // 存储队列的大小
    queue->front = 0;  // 初始化队列的头
    queue->rear = 0;  // 初始化队列的尾
    return queue;  // 返回队列
}

// 判断队列是否为空
bool isQueueEmpty(Queue *queue) {
    
    
    return queue->front == queue->rear;  // 判断队列的头是否等于队列的尾
}

// 判断队列是否已满
bool isQueueFull(Queue *queue) {
    
    
    return (queue->rear + 1) % queue->size == queue->front;  // 判断队列的尾是否等于队列的头的前一个位置
}

// 入队
bool enqueue(Queue *queue, void *data, size_t size) {
    
    
    if (isQueueFull(queue)) {
    
      // 判断队列是否已满
        return false;  // 如果队列已满,返回 false
    }
    QueueElement *element = &(queue->elements[queue->rear]);  // 获取队列的尾元素
    element->data = malloc(size);  // 为元素的数据分配内存
    if (element->data == NULL) {
    
      // 判断内存是否分配成功
        return false;  // 如果内存分配失败,返回 false
    }
    element->size = size;  // 存储元素的大小
    memcpy(element->data, data, size);  // 将元素的数据复制到队列中
    queue->rear = (queue->rear + 1) % queue->size;  // 将队列的尾指针向后移动
    return true;  // 入队成功,返回 true
}

// 出队
bool dequeue(Queue *queue, void *data, size_t size) {
    
    
    if (isQueueEmpty(queue)) {
    
      // 判断队列是否为空
        return false;  // 如果队列为空,返回 false
    }
    QueueElement *element = &(queue->elements[queue->front]);  // 获取队列的头元素
    memcpy(data, element->data, size);  // 将元素的数据复制到 data 中
    free(element->data);  // 释放元素的数据的内存
    element->data = NULL;  // 将元素的数据的指针指向 NULL
    element->size = 0;  // 将元素的大小设置为 0
    queue->front = (queue->front + 1) % queue->size;  // 将队列的头指针向后移动
    return true;  // 出队成功,返回 true
}

// 销毁队列
void destroyQueue(Queue *queue) {
    
    
    while (!isQueueEmpty(queue)) {
    
      // 循环直到队列为空
        QueueElement *element = &(queue->elements[queue->front]);  // 获取队列的头元素
        free(element->data);  // 释放元素的数据的内存
        element->data = NULL;  // 将元素的数据的指针指向 NULL
        element->size = 0;  // 将元素的大小设置为 0
        queue->front = (queue->front + 1) % queue->size;  // 将队列的头指针向后移动
    }
    free(queue->elements);  // 释放队列中元素的内存
    queue->elements = NULL;  // 将队列中元素的指针指向 NULL
    queue->size = 0;  // 将队列的大小设置为 0
    queue->front = 0;  // 将队列的头指针设置为 0
    queue->rear = 0;  // 将队列的尾指针设置为 0
    free(queue);  // 释放队列的内存
}

// 示例程序
int main() {
    
    
    Queue *queue = createQueue(QUEUE_SIZE);  // 创建队列
    int intData = 1;  // 定义 int 类型的数据
    enqueue(queue, &intData, sizeof(int));  // 将 int 类型的数据入队
    intData = 2;  // 定义 int 类型的数据
    enqueue(queue, &intData, sizeof(int));  // 将 int 类型的数据入队
    intData = 3;  // 定义 int 类型的数据
    enqueue(queue, &intData, sizeof(int));  // 将 int 类型的数据入队
    intData = 0;  // 定义 int 类型的数据
    while (dequeue(queue, &intData, sizeof(int))) {
    
      // 循环直到队列为空
        printf("%d ", intData);  // 输出队列中的元素
    }
    destroyQueue(queue);  // 销毁队列
    return 0;  // 返回 0
}

このサンプル コードでは、キューの要素を格納するために QueueElement を使用し、キューの要素とキューの状態を格納するために Queue を使用する 2 つの構造体を定義します。void *data を使用して汎用要素を保存し、size_t size を使用して要素のサイズを保存します。前後の 2 つのポインタを使用して、キューの先頭と末尾を示します。isQueueEmpty と isQueueFull という 2 つの関数を使用して、キューが空かいっぱいかを判断します。createQueue、enqueue、dequeue、destroyQueue という 4 つの関数を使用して、キューの作成、エンキュー、デキュー、破棄を行います。サンプル プログラムを使用して、キューの使用方法を示しました。

おすすめ

転載: blog.csdn.net/phker/article/details/131231790