赞
踩
一、链式队列的定义
二、链式队列的实现
三、链式队列的基本操作
在数据结构中,队列(Queue)是一种常见的线性数据结构,遵循先进先出(First In First Out,FIFO)的原则。链式队列是队列的一种实现方式,它使用链表来存储队列中的元素。本篇博客将详细介绍链式队列的定义、实现和基本操作,并附带有带有注释的示例代码。
链式队列是通过链表实现的一种队列,它将队列的元素通过指针连接起来。链式队列不需要预先分配固定大小的存储空间,因此可以动态增长,更加灵活。
// 定义节点结构
typedef struct Node {
int data;
struct Node* next;
} Node;
// 定义链式队列
typedef struct {
Node* front;
Node* rear;
} LinkedQueue;
// 初始化链式队列
void initLinkedQueue(LinkedQueue* queue) {
queue->front = NULL;
queue->rear = NULL;
}
// 判断队列是否为空
int isEmpty(LinkedQueue* queue) {
return queue->front == NULL;
}
// 入队操作 void enqueue(LinkedQueue* queue, TypeData value) { // 创建新节点 Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = value; newNode->next = NULL; if (isEmpty(queue)) { // 队列为空,新节点成为队头 queue->front = newNode; queue->rear = newNode; } else { // 将新节点插入到队尾 queue->rear->next = newNode; queue->rear = newNode; } }
// 出队操作 int dequeue(LinkedQueue* queue) { int value = -1; if (!isEmpty(queue)) { // 保存队头节点的值 value = queue->front->data; // 删除队头节点 Node* temp = queue->front; queue->front = queue->front->next; free(temp); // 队列为空时,更新rear指针 if (queue->front == NULL) { queue->rear = NULL; } } return value; }
// 获取队列的长度
int getQueueLength(LinkedQueue* queue) {
Node* current = queue->front;
int length = 0;
while (current != NULL) {
length++;
current = current->next;
}
return length;
}
// 打印队列内的元素
void printQueue(LinkedQueue* queue) {
Node* current = queue->front;
printf("Queue: ");
while (current != NULL) {
printf("%d ", current->data);
current = current->next;
}
printf("\n");
}
链式队列适用于在不确定队列大小的情况下,动态地存储数据。它可以用于解决生产者-消费者问题,以及在需要异步处理数据的情况下。
①listqueue.h
#ifndef _LISTQUEUE_H_ #define _LISTQUEUE_H_ #include <stdio.h> #include <stdlib.h> typedef int TypeData; typedef struct Node { TypeData data; struct Node* next; } Node; typedef struct { Node* front; Node* rear; } LinkedQueue; // 初始化链式队列 void initLinkedQueue(LinkedQueue* queue); // 判断队列是否为空 int isEmpty(LinkedQueue* queue); // 入队操作 void enqueue(LinkedQueue* queue, TypeData value) ; // 出队操作 int dequeue(LinkedQueue* queue); // 获取队列的长度 int getQueueLength(LinkedQueue* queue) // 打印队列内的元素 void printQueue(LinkedQueue* queue); #endif
②listqueue.c
#include "listqueue.h" // 初始化链式队列 void initLinkedQueue(LinkedQueue* queue) { queue->front = NULL; queue->rear = NULL; } // 判断队列是否为空 int isEmpty(LinkedQueue* queue) { return queue->front == NULL; } // 入队操作 void enqueue(LinkedQueue* queue, TypeData value) { // 创建新节点 Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = value; newNode->next = NULL; if (isEmpty(queue)) { // 队列为空,新节点成为队头 queue->front = newNode; queue->rear = newNode; } else { // 将新节点插入到队尾 queue->rear->next = newNode; queue->rear = newNode; } } // 出队操作 int dequeue(LinkedQueue* queue) { int value = -1; if (!isEmpty(queue)) { // 保存队头节点的值 value = queue->front->data; // 删除队头节点 Node* temp = queue->front; queue->front = queue->front->next; free(temp); // 队列为空时,更新rear指针 if (queue->front == NULL) { queue->rear = NULL; } } return value; } // 获取队列的长度 int getQueueLength(LinkedQueue* queue) { Node* current = queue->front; int length = 0; while (current != NULL) { length++; current = current->next; } return length; } // 打印队列内的元素 void printQueue(LinkedQueue* queue) { Node* current = queue->front; printf("Queue: "); while (current != NULL) { printf("%d ", current->data); current = current->next; } printf("\n"); }
③listqueue_main.c
#include "listqueue.h" #include "listqueue.c" int main() { LinkedQueue queue; initLinkedQueue(&queue); // 入队操作 enqueue(&queue, 10); enqueue(&queue, 20); enqueue(&queue, 30); // 打印队列内的元素 printQueue(&queue); // 获取队列长度 int length = getQueueLength(&queue); printf("Queue length: %d\n", length); // 出队操作 int value = dequeue(&queue); printf("Dequeued value: %d\n", value); // 打印出队后的队列 printQueue(&queue); // 获取出队后的队列长度 length = getQueueLength(&queue); printf("Queue length: %d\n", length); return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。