实现链式队列的基本操作——C语言


前言

链式队列的创建销毁增删查基本操作

一、头文件

#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;
}

四、输出样例

在这里插入图片描述


总结

链式队列显然不具有满的概念,所以也不需要执行判满操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值