<返回更多

如何用C语言写一个万能队列

2023-06-27  今日头条  记录我的编程生活
加入收藏

前面写了一篇用C语言实现一个万能单向链表,后来我想了下。在工作开发中,貌似用到队列这种机制的情况更常见。所以,本次用C语言写一个万能的队列。简单介绍下,队列是一种严格的线性储存结构,队列的两端都是开放的,要求数据只能从一端进,而从另一端出,也就是常说的“先进先出”。如下图展示:

以下基于C语言实现的万能队列,想套用到你的工程中,需要你先看懂,再运用。

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

 //队列中的每个节点
typedef struct Node {
    void *data;//这个是万能数据类型的核心点
    struct Node *next;
} Node;

//用来指向队头、队尾的两个指针变量
typedef struct {
    Node *front;//始终指向队头,这句话的意思很重要,很重要。
    Node *rear;//始终指向队尾,这句话的意思依然很重要,很重要。
} Queue;

//创建队列
Queue *create_queue() {
    Queue *queue = (Queue*)malloc(sizeof(Queue));
    queue->front = NULL;
    queue->rear = NULL;
    return queue;
}

//队列是否为空
int is_empty(Queue *queue) {
    return (queue->front == NULL);
}

//入队
void enqueue(Queue *queue, void *data) {
    Node *node = (Node*)malloc(sizeof(Node));
    node->data = data;
    node->next = NULL;
  
    if (is_empty(queue)) {
        queue->front = node;
    } else {
        queue->rear->next = node;
    }
    queue->rear = node;
}

//出队
void *dequeue(Queue *queue) {
    if (is_empty(queue)) {
        printf("Queue underflown");
        return NULL;
    }
    void *data = queue->front->data;
    Node *temp = queue->front;
    queue->front = queue->front->next;
    free(temp);
  
    if (queue->front == NULL) {
        queue->rear = NULL;
    }
    return data;
}

int mAIn() {
    Queue *queue = create_queue();
    
    // Enqueue integers,入队
    int a = 10, b = 20, c = 30;
    enqueue(queue, &a);
    enqueue(queue, &b);
    enqueue(queue, &c);
    
    // Dequeue integers,出队
    int *x = (int*)dequeue(queue);
    int *y = (int*)dequeue(queue);
    int *z = (int*)dequeue(queue);
    printf("%d %d %dn", *x, *y, *z); // Output: 10 20 30
   
    // Enqueue strings
    char *str1 = "Hello", *str2 = "world";
    enqueue(queue, str1);
    enqueue(queue, str2);
    
    // Dequeue strings
    char *s1 = (char*)dequeue(queue);
    char *s2 = (char*)dequeue(queue);

    printf("%s %sn", s1, s2); // Output: Hello world
    return 0;
}

多余的解释:

  1. 万能的存储数据类型,关键点在于void *data;
  2. 注意到*front、*rear两个指针变量,始终指向队头、队尾;
  3. 队列的宗旨,先进先出;
  4. 为避免后面用的时候找不到,先点赞再收藏。
声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>