编写一个单链表循环队列,实现入队、出队操作,判断队空等特殊情况。 c语言表示
时间: 2024-05-05 20:19:20 浏览: 182
这是一个比较简单的问题,你可以按照以下的方式来实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 10
typedef struct queue_node {
int data;
struct queue_node* next;
} QueueNode;
typedef struct queue {
QueueNode* front;
QueueNode* rear;
} Queue;
void init_queue(Queue* q) {
q->front = q->rear = NULL;
}
int is_queue_empty(Queue* q) {
return (q->front == NULL && q->rear == NULL);
}
int is_queue_full(Queue* q) {
return 0;
}
int enqueue(Queue* q, int data) {
QueueNode* new_node = (QueueNode*) malloc(sizeof(QueueNode));
if (new_node == NULL) {
return 0;
}
new_node->data = data;
new_node->next = NULL;
if (is_queue_empty(q)) {
q->front = q->rear = new_node;
}
else {
q->rear->next = new_node;
q->rear = new_node;
}
return 1;
}
int dequeue(Queue* q) {
if (is_queue_empty(q)) {
return -1;
}
int data = q->front->data;
QueueNode* tmp = q->front;
if (q->front == q->rear) {
q->front = q->rear = NULL;
}
else {
q->front = q->front->next;
}
free(tmp);
return data;
}
void print_queue(Queue* q) {
QueueNode* tmp = q->front;
while (tmp != NULL) {
printf("%d ", tmp->data);
tmp = tmp->next;
}
printf("\n");
}
int main() {
Queue q;
int data;
init_queue(&q);
enqueue(&q, 1);
enqueue(&q, 2);
enqueue(&q, 3);
enqueue(&q, 4);
printf("After enqueue: ");
print_queue(&q);
data = dequeue(&q);
printf("After dequeue: %d\n", data);
printf("After dequeue again: %d\n", dequeue(&q));
printf("After enqueue again: ");
enqueue(&q, 5);
print_queue(&q);
return 0;
}
```
在这个程序中,我们定义了一个包含两个指针的结构体 `Queue`,其中 `front` 指向队头,`rear` 指向队尾。然后我们定义了两个辅助函数 `is_queue_empty` 和 `is_queue_full`,用于判断队列是否为空或者已满。
我们还定义了四个操作,分别是 `init_queue` 初始化队列、`enqueue` 入队、`dequeue` 出队以及 `print_queue` 打印队列。其中,入队操作是在队列尾部添加元素,出队操作是删除队列头部的元素。
最后,我们在主函数中测试了这些操作,打印了队列的状态。
阅读全文