前面寫了一篇用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;
}
【多余的解釋:】
- 萬能的存儲數據類型,關鍵點在于void *data;
- 注意到*front、*rear兩個指針變量,始終指向隊頭、隊尾;
- 隊列的宗旨,先進先出;
- 為避免后面用的時候找不到,先點贊再收藏。