C语言实现链队列入队,出队等操作
时间: 2024-10-22 09:19:34 浏览: 61
在C语言中,链表是一种动态数据结构,适合用来实现队列这种需要在两端添加和删除元素的数据结构。下面是一个简单的单向链表队列实现的例子,包括入队(enqueue)和出队(dequeue)的操作:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node {
int data;
struct Node* next; // 指向下一个节点的指针
} Node;
// 创建新节点
Node* create_node(int data) {
Node* new_node = (Node*)malloc(sizeof(Node));
if (!new_node) {
printf("Memory allocation failed.\n");
return NULL;
}
new_node->data = data;
new_node->next = NULL;
return new_node;
}
// 队列结构体
typedef struct Queue {
Node* front; // 队头
Node* rear; // 队尾
} Queue;
// 初始化空队列
Queue* init_queue() {
Queue* queue = (Queue*)malloc(sizeof(Queue));
queue->front = queue->rear = NULL;
return queue;
}
// 入队操作(Enqueue)
void enqueue(Queue* queue, int data) {
Node* new_node = create_node(data);
if (!new_node) return;
if (!queue->rear) { // 如果队列为空,设置队首和队尾
queue->front = queue->rear = new_node;
} else {
new_node->next = queue->rear;
queue->rear->next = new_node; // 队尾连接新节点
queue->rear = new_node; // 更新队尾
}
}
// 出队操作(Dequeue)
int dequeue(Queue* queue) {
if (!queue->front) {
printf("Queue is empty.\n");
return -1; // 或者抛出异常,表示无法出队
}
int data = queue->front->data; // 保存要移除的数据
Node* temp = queue->front; // 临时存储队首
if (queue->front == queue->rear) { // 队列仅有一个元素时处理特殊情况
queue->front = queue->rear = NULL;
} else {
queue->front = queue->front->next; // 移动队头
}
free(temp); // 释放已移动到堆外的队首节点
return data;
}
// 示例
int main() {
Queue* queue = init_queue();
enqueue(queue, 1);
enqueue(queue, 2);
enqueue(queue, 3);
printf("Dequeued: %d\n", dequeue(queue)); // 输出: Dequeued: 1
printf("Dequeued: %d\n", dequeue(queue)); // 输出: Dequeued: 2
printf("Is the queue empty? %s\n", queue->front ? "No" : "Yes"); // 输出: Is the queue empty? No
return 0;
}
```
阅读全文