基于链表的队列实现

首先建立头文件"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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值