前言
链式队列的创建销毁增删查基本操作
一、头文件
#ifndef LIST_QUEUE_H
#define LIST_QUEUE_H
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
// 定义队列中的元素类型
typedef int ElementType;
// 队列节点的结构
typedef struct node_s {
ElementType data;
struct node_s *next;
} QueueNode;
// 队列的结构
typedef struct {
QueueNode *front; // 队头结点指针
QueueNode *rear; // 队尾结点指针
} LinkedListQueue;
// 函数声明
// 创建链式队列
LinkedListQueue *create_queue();
// 销毁链式队列
void destroy_queue(LinkedListQueue *q);
// 入队列
bool enqueue(LinkedListQueue *q, ElementType element);
// 出队列并返回队头元素
ElementType dequeue(LinkedListQueue *q);
// 访问队头元素
ElementType peek_queue(LinkedListQueue *q);
// 判空
bool is_empty(LinkedListQueue *q);
#endif // !LIST_QUEUE_H
二、链式队列的基本操作
#include "list_queue.h"
// 创建链式队列
LinkedListQueue* create_queue() {
return calloc(1, sizeof(LinkedListQueue));
}
// 销毁链式队列
void destroy_queue(LinkedListQueue* q) {
QueueNode* curr = q;
while (curr) {
QueueNode* tmp = curr->next;
free(curr);
curr =tmp;
}
free(q);
}
// 入队列
bool enqueue(LinkedListQueue* q, ElementType element) {
QueueNode* new_node = malloc(sizeof(QueueNode));
if (new_node == NULL) {
printf("error:new_node failed in enqueue.\n");
exit(1);
}
new_node->data = element;
new_node->next = NULL;
if (q->front == NULL ) {
q->front = new_node;
q->rear = new_node;
}
else {
q->rear->next = new_node;
q->rear = new_node;
}
return true;
}
// 出队列并返回队头元素
ElementType dequeue(LinkedListQueue* q) {
if (is_empty(q)) {
printf("queue is empty.\n");
exit(1);
}
QueueNode* tmp = q->front ;
int ret = q->front->data;
q->front = tmp->next;
if (q->rear = tmp) {
//队列中原本只剩一个元素
q->rear = NULL;
}
free(tmp);
return ret;
}
// 访问队头元素
ElementType peek_queue(LinkedListQueue* q) {
if (q->front == NULL) {
printf("queue is empty.\n");
return NULL;
}
return q->front->data;
}
// 判空
bool is_empty(LinkedListQueue* q) {
if (q->front == NULL) {
return true;
}
else {
return false;
}
}
三、测试源
#include "list_queue.h"
int main(void) {
LinkedListQueue* queue = create_queue();
enqueue(queue,1);
enqueue(queue,2);
enqueue(queue,3);
enqueue(queue,4);
enqueue(queue,5);
printf("第一个出队元素为%d\n", dequeue(queue));
printf("访问队头元素为%d\n", peek_queue(queue));
return 0;
}
四、输出样例
总结
链式队列显然不具有满的概念,所以也不需要执行判满操作。