用C语言实现链队列的初始化、入队、出队等操作。
时间: 2024-06-17 22:03:47 浏览: 121
链队列是一种特殊的链表,它只能在队列的两端进行插入和删除操作。下面是用C语言实现链队列的初始化、入队、出队等操作的示例代码:
```
#include <stdio.h>
#include <stdlib.h>
// 链队列结点结构体
typedef struct QueueNode {
int data;
struct QueueNode *next;
} QueueNode;
// 链队列结构体
typedef struct {
QueueNode *front; // 队头指针
QueueNode *rear; // 队尾指针
} LinkQueue;
// 初始化链队列
void InitQueue(LinkQueue *q) {
q->front = q->rear = (QueueNode *)malloc(sizeof(QueueNode)); // 创建头结点
if (!q->front) { // 内存分配失败
exit(-1);
}
q->front->next = NULL; // 头结点的next指针为空
}
// 判断链队列是否为空
int IsEmpty(LinkQueue *q) {
return q->front == q->rear;
}
// 入队操作
void EnQueue(LinkQueue *q, int x) {
QueueNode *s = (QueueNode *)malloc(sizeof(QueueNode));
if (!s) { // 内存分配失败
exit(-1);
}
s->data = x;
s->next = NULL;
q->rear->next = s; // 将s插入到队尾
q->rear = s; // 修改队尾指针
}
// 出队操作
int DeQueue(LinkQueue *q) {
if (IsEmpty(q)) { // 队列为空
printf("Queue is empty!\n");
exit(-1);
}
QueueNode *p = q->front->next;
int x = p->data;
q->front->next = p->next; // 修改队头指针
if (q->rear == p) { // 如果队列只有一个元素,删除后将队尾指针置为头结点
q->rear = q->front;
}
free(p); // 释放结点p的空间
return x;
}
// 输出链队列中的所有元素
void PrintQueue(LinkQueue *q) {
QueueNode *p = q->front->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
// 主函数测试链队列操作
int main() {
LinkQueue q;
InitQueue(&q);
EnQueue(&q, 1);
EnQueue(&q, 2);
EnQueue(&q, 3);
printf("出队元素:%d\n", DeQueue(&q));
printf("出队元素:%d\n", DeQueue(&q));
printf("出队元素:%d\n", DeQueue(&q));
EnQueue(&q, 4);
EnQueue(&q, 5);
PrintQueue(&q);
}
```
阅读全文