用C语言分别实现顺序循环队列和链队的定义、创建、入队和出队操作
时间: 2024-12-20 10:25:17 浏览: 16
在C语言中,我们可以使用数组实现顺序循环队列,而使用结构体和指针实现链式队列。
### 1. 顺序循环队列 (Circular Queue)
**定义:**
```c
#define MAX_SIZE 100 // 队列最大容量
typedef struct {
int front; // 队头索引
int rear; // 队尾索引
int data[MAX_SIZE]; // 存储数据的数组
} Queue;
```
**创建:**
```c
Queue queue;
queue.front = -1;
queue.rear = -1;
```
**入队 (enqueue):**
```c
void enqueue(Queue *q, int value) {
if ((q->rear + 1) % MAX_SIZE == q->front) { // 判断是否已满
printf("Queue is full.\n");
return;
}
q->data[(q->rear + 1) % MAX_SIZE] = value; // 循环更新队尾
q->rear = (q->rear + 1) % MAX_SIZE;
}
```
**出队 (dequeue):**
```c
int dequeue(Queue *q) {
if (q->front == -1) { // 判空
printf("Queue is empty.\n");
return -1;
}
int value = q->data[q->front]; // 取出队头元素
q->front = (q->front + 1) % MAX_SIZE; // 更新队头
return value;
}
```
### 2. 链式队列 (Linked Queue)
**定义:**
```c
typedef struct Node {
int data;
struct Node* next;
} Node;
typedef struct Queue {
Node* front;
Node* rear;
} LinkedListQueue;
```
**创建:**
```c
LinkedListQueue queue;
queue.front = queue.rear = NULL;
```
**入队 (enqueue):**
```c
void enqueue(LinkedListQueue *q, int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->next = NULL;
if (q->rear == NULL) {
q->front = q->rear = newNode;
} else {
q->rear->next = newNode;
q->rear = newNode;
}
}
```
**出队 (dequeue):**
```c
int dequeue(LinkedListQueue *q) {
if (q->front == NULL) { // 判空
printf("Queue is empty.\n");
return -1;
}
int value = q->front->data;
Node* temp = q->front;
q->front = q->front->next;
if (q->front == NULL) {
q->rear = NULL;
}
free(temp); // 释放节点内存
return value;
}
```
阅读全文