首先建立头文件"ql.h"
/* 基于链表的队列 */
#ifndef _QL_H
#define _QL_H
#include <sys/types.h>
/* 节点 */
typedef struct QueueNode {
int data; /* 数据 */
struct QueueNode* next; /* 后指针 */
} QUEUE_NODE;
/* 队列 */
typedef struct Queue {
QUEUE_NODE* front; /* 前端(弹出) */
QUEUE_NODE* rear; /* 后端(压入) */
} QUEUE;
/* 初始化为空队列 */
void queue_init (QUEUE* queue);
/* 释放剩余节点并恢复到初始状态 */
void queue_deinit (QUEUE* queue);
/* 判断是否空 */
int queue_empty (QUEUE* queue);
/* 压入 */
void queue_push (QUEUE* queue, int data);
/* 弹出 */
int queue_pop (QUEUE* queue);
/* 队首 */
int queue_front (QUEUE* queue);
/* 数量 */
size_t queue_size (QUEUE* queue);
#endif /* _QL_H */
函数实现部分“ql.c”
/* 基于链表的队列 */
#include <stdlib.h>
#include "ql.h"
/* 创建节点 */
static QUEUE_NODE* create_node (int data) {
QUEUE_NODE* node = malloc (sizeof (QUEUE_NODE));
node->data = data;
node->next = NULL;
return node;
}
/* 删除节点 */
static QUEUE_NODE* destroy_node (QUEUE_NODE* node) {
QUEUE_NODE* next = node->next;
free (node);
return next;
}
/* 初始化为空队列 */
void queue_init (QUEUE* queue) {
queue->front = NULL;
queue->rear = NULL;
}
/* 释放剩余节点并恢复到初始状态 */
void queue_deinit (QUEUE* queue) {
while (queue->front)
queue->front = destroy_node (queue->front);
queue->rear = NULL;
}
/* 判断是否空 */
int queue_empty (QUEUE* queue) {
return ! queue->front && ! queue->rear;
}
/* 压入 */
void queue_push (QUEUE* queue, int data) {
QUEUE_NODE* rear = create_node (data);
if (queue->rear)
queue->rear->next = rear;
else
queue->front = rear;
queue->rear = rear;
}
/* 弹出 */
int queue_pop (QUEUE* queue) {
int data = queue->front->data;
if (! (queue->front = destroy_node (queue->front)))
queue->rear = NULL;
return data;
}
/* 队首 */
int queue_front (QUEUE* queue) {
return queue->front->data;
}
/* 数量 */
size_t queue_size (QUEUE* queue) {
size_t size = 0;
QUEUE_NODE* node;
for (node = queue->front; node;node = node->next)
++size;
return size;
}
测试用例“ql_test.c”
/* 基于链表的队列 */
#include <stdio.h>
#include "ql.h"
/* 测试用例 */
int main (void) {
QUEUE queue;
queue_init (&queue);
for (;;) {
int data;
scanf ("%d", &data);
if (data < 0)
break;
queue_push (&queue, data);
}
while (! queue_empty (&queue))
printf ("%d ", queue_pop (&queue));
printf ("\n");
queue_deinit (&queue);
return 0;
}