c语言链队列,建立队列,入队,出队,遍历队列
时间: 2023-06-14 22:03:27 浏览: 91
C语言单链队列的表示与实现实例详解
以下是基于C语言实现链队列的代码,包括建立队列、入队、出队和遍历队列的操作:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链队列结构体
typedef struct Node {
int data; // 队列元素
struct Node *next; // 指向下一个节点的指针
} Node, *QueuePtr;
typedef struct {
QueuePtr front; // 队头指针
QueuePtr rear; // 队尾指针
} LinkQueue;
// 初始化队列
void InitQueue(LinkQueue *Q) {
Q->front = Q->rear = (QueuePtr)malloc(sizeof(Node)); // 首节点即为头结点,无数据元素
if (!Q->front) {
exit(0); // 内存分配失败,退出程序
}
Q->front->next = NULL;
}
// 判断队列是否为空
int IsEmptyQueue(LinkQueue Q) {
if (Q.front == Q.rear) {
return 1; // 队列为空
} else {
return 0;
}
}
// 入队操作
void EnQueue(LinkQueue *Q, int e) {
QueuePtr p = (QueuePtr)malloc(sizeof(Node));
if (!p) {
exit(0); // 内存分配失败,退出程序
}
p->data = e; // 新节点存储数据元素
p->next = NULL;
Q->rear->next = p; // 将新节点插入队尾
Q->rear = p; // 修改队尾指针
}
// 出队操作
int DeQueue(LinkQueue *Q) {
int e;
QueuePtr p;
if (Q->front == Q->rear) {
return -1; // 队列为空,返回-1
}
p = Q->front->next; // 指向队头节点
e = p->data; // 获取队头元素
Q->front->next = p->next; // 修改队头指针
if (Q->rear == p) { // 如果队头是队尾,则出队后队列为空
Q->rear = Q->front;
}
free(p); // 释放队头节点
return e;
}
// 遍历队列
void TraverseQueue(LinkQueue Q) {
QueuePtr p = Q.front->next;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
LinkQueue Q;
InitQueue(&Q);
EnQueue(&Q, 1);
EnQueue(&Q, 2);
EnQueue(&Q, 3);
EnQueue(&Q, 4);
TraverseQueue(Q); // 输出队列元素
int e = DeQueue(&Q);
printf("DeQueue: %d\n", e);
TraverseQueue(Q); // 输出队列元素
return 0;
}
```
输出结果为:
```
1 2 3 4
DeQueue: 1
2 3 4
```
阅读全文