C语言——队列的实现

队列按照先进先出(FIFO,First In First Out)的原则管理数据。这意味着最先进入队列的元素会被最先移出,类似于排队等候服务的情况。队列通常有两个主要操作:入队(enqueue),将元素添加到队列的尾部;出队(dequeue),从队列的头部移除元素。

如果用顺序表实现队列,在删除队头数据时,需要后面的数据覆盖前面的数据,比较麻烦,所以采用链表,头删尾插代替出队和入队 。但是如果用链表实现的话,寻找队尾入队还需要一直 ->next ,所以干脆我们就记录下头指针和尾指针方便头山尾插。

首先就是定义每个节点的结构体和定义队列的结构体:

cpp 复制代码
struct QueueList {
	int val;
	struct QueueList* next;
};
struct Queue {
	struct QueueList* head;
	struct QueueList* tail;
};

这里用QueueNode命名第一个结构体更好,因为我们要记录头尾指针,所以Queue结构体就有头尾两个指针。

接下来是初始化函数和销毁函数;

cpp 复制代码
void QueueInit(struct Queue* list) {
	list->head = NULL;
	list->tail = NULL;
}
void QueueDes(struct Queue* list) {
	while (list->head!=list->tail)
	{
		struct QueueList* next = list->head->next;
		free(list->head);
		list->head = next;
	}
	free(list->head);
	list->head = list->tail = NULL;
}

初始化函数让list的头指针和尾指针都置为空,销毁函数,如果头尾指针相等,有两种情况,一种是空队列,这时 free(NULL) ,还可以是只有一个元素,头尾指针都指向这个元素,这时free掉,然后指针置空,所以不会有野指针或者free错误的情况。

然后是入队出队函数:

cpp 复制代码
void QueuePushBack(struct Queue* list,int num) {
	if (list->head == list->tail && list->head == NULL) {
		list->head = list->tail = malloc(sizeof(struct QueueList));
		list->head->val = num;
		list->tail->next = NULL;
	}
	else if (list->head == list->tail) {
		list->tail = malloc(sizeof(struct QueueList));
		list->tail->val = num;
		list->tail->next = NULL;
		list->head->next = list->tail;
	}
	else {
		struct QueueList* tail_pre = list->tail;
		list->tail = malloc(sizeof(struct QueueList));
		list->tail->val = num;
		list->tail->next = NULL;
		tail_pre->next = list->tail;
	}
}
int QueueFrontPop(struct Queue* list) {
	struct QueueList* new_head = list->head->next;
	int val = list->head->val;
	free(list->head);
	list->head = new_head;
	return val;
}

对于尾插函数,头尾指针相等时有可能是空队列也有可能是只创建了一个元素,所以要分开讨论,简单逻辑就是让尾节点的next指向新开辟的节点,然后更新尾指针使新开辟的节点变为尾指针,最后让尾节点的next置为NULL。

对于头删Pop函数,就是先存头节点下一个节点的地址然后free掉头节点,更新头指针,返回数值。

最后是打印函数方便我们观察:

cpp 复制代码
void QueuePrint(struct Queue* list) {
	struct QueueList* cur = list->head;
	while (cur != NULL) {
		printf("%d ", cur->val);
		cur = cur->next;
	}
}

这就是文章的全部内容,希望对你有所帮助,如有错误欢迎评论。

相关推荐
小王努力学编程31 分钟前
【算法与数据结构】单调队列
数据结构·c++·学习·算法·leetcode
LaoZhangGong12344 分钟前
STM32的“Unique device ID“能否修改?
c语言·经验分享·stm32·单片机·嵌入式硬件
万兴丶1 小时前
Unity 适用于单机游戏的红点系统(前缀树 | 数据结构 | 设计模式 | 算法 | 含源码)
数据结构·unity·设计模式·c#
程序员东min1 小时前
数据结构:实验题目:单链表归并。将两个非递减次序排列的单链表归并为一个非递增次序排列的单链表,并计算表长。要求利用原来两个单链表的结点存放合并后的单链表。
数据结构
黄雪超3 小时前
深入HBase——核心组件
数据结构·数据库·hbase
让我们一起加油好吗3 小时前
【排序算法】六大比较类排序算法——插入排序、选择排序、冒泡排序、希尔排序、快速排序、归并排序【详解】
c语言·算法·排序算法
夏末秋也凉3 小时前
力扣-贪心-53 最大子数组和
数据结构·算法·leetcode
老猿讲编程6 小时前
安全C语言编码规范概述
c语言·开发语言·安全
OrangeJiuce6 小时前
【QT中的一些高级数据结构,持续更新中...】
数据结构·c++·qt
01_9 小时前
力扣hot100——相交,回文链表
算法·leetcode·链表·双指针