前面写了一篇用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;
}
【多余的解释:】