c语言实现链式存储结构的队列,要求详细写好备注
时间: 2023-05-19 20:01:24 浏览: 61
非常感谢您的提问,以下是C语言实现链式存储结构的队列的代码和详细备注:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义队列节点结构体
typedef struct Node {
int data; // 数据域
struct Node *next; // 指针域
} Node;
// 定义队列结构体
typedef struct Queue {
Node *front; // 队头指针
Node *rear; // 队尾指针
} Queue;
// 初始化队列
void initQueue(Queue *q) {
q->front = q->rear = NULL; // 队头和队尾指针都指向NULL
}
// 判断队列是否为空
int isEmpty(Queue *q) {
return q->front == NULL; // 队头指针为NULL则队列为空
}
// 入队
void enQueue(Queue *q, int data) {
Node *newNode = (Node *)malloc(sizeof(Node)); // 创建新节点
newNode->data = data; // 赋值
newNode->next = NULL; // 新节点的指针域指向NULL
if (isEmpty(q)) { // 如果队列为空
q->front = q->rear = newNode; // 队头和队尾指针都指向新节点
} else {
q->rear->next = newNode; // 队尾节点的指针域指向新节点
q->rear = newNode; // 队尾指针指向新节点
}
}
// 出队
int deQueue(Queue *q) {
if (isEmpty(q)) { // 如果队列为空
printf("队列为空,无法出队!\n");
return -1;
}
int data = q->front->data; // 取出队头节点的数据
Node *temp = q->front; // 保存队头节点的指针
q->front = q->front->next; // 队头指针指向下一个节点
free(temp); // 释放原队头节点的内存
return data;
}
// 打印队列
void printQueue(Queue *q) {
if (isEmpty(q)) { // 如果队列为空
printf("队列为空!\n");
return;
}
Node *p = q->front; // 从队头开始遍历
while (p != NULL) {
printf("%d ", p->data); // 输出节点的数据
p = p->next; // 指针指向下一个节点
}
printf("\n");
}
int main() {
Queue q;
initQueue(&q);
enQueue(&q, 1);
enQueue(&q, 2);
enQueue(&q, 3);
printf("队列中的元素为:");
printQueue(&q);
printf("出队元素为:%d\n", deQueue(&q));
printf("出队元素为:%d\n", deQueue(&q));
printf("队列中的元素为:");
printQueue(&q);
enQueue(&q, 4);
printf("队列中的元素为:");
printQueue(&q);
return 0;
}
```
备注:
1. 定义了队列节点结构体和队列结构体,其中队列结构体包含队头指针和队尾指针。
2. 初始化队列时,将队头指针和队尾指针都指向NULL。
3. 判断队列是否为空时,只需要判断队头指针是否为NULL即可。
4. 入队时,先创建一个新节点,然后根据队列是否为空来更新队头指针和队尾指针。
5. 出队时,先判断队列是否为空,如果为空则输出提示信息,否则取出队头节点的数据,更新队头指针,释放原队头节点的内存,并返回取出的数据。
6. 打印队列时,先判断队列是否为空,如果为空则输出提示信息,否则从队头开始遍历,输出每个节点的数据。
7. 在main函数中,先初始化队列,然后进行入队和出队操作,最后打印队列中的元素。