队列的定义及基本操作实现(链式)

个人主页:【😊个人主页】
系列专栏:【❤️数据结构与算法】
学习名言:天子重英豪,文章教儿曹。万般皆下品,惟有读书高

系列文章目录

第一章 ❤️ 学前知识
第二章 ❤️ 单向链表
第三章 ❤️ 递归



前言

在这里插入图片描述


一.队列是什么?🧐🧐🧐

和栈相反,队列( queue)是一种先进先出( First In First Out, FIFO) 的线性表。它只允许在表的一端进行插人,而在另一端删除元素。这和日常生活中的排队是一致的, 最早进入队列的元素最早离开。在队列中,允许插入的一端称为队尾( rear),允许删除的一端则称为队 头( front) 。假设队列为q=(a1,a2, .,an),那么,a就是队头元素, a,则是队尾元素。队列中的元素是按照a, a, … a,的顺序进人的,退出队列也只能按照这个次序依次退出,也就是说,只有在a,a., an,都离开队列之后,a,才能退出队列。

请添加图片描述

二、队列与线性表的关系🆚🆚🆚

与栈一样队列也是一种重要的线性结构。从数据结构角度看,队列也是线性表,其特殊性在于队列的基本操作是线性表操作的子集,它们是操作受限的线性表,因此,可称为具有限定性的数据结构。但从数据类型角度看,它是和线性表不相同的两类重要的抽象数据类型。


三、队列的基本操作🔬🔬🔬

1.队列的储存结构结构💻

typedef struct Qnode
{
	Elemtype data;
	struct Qnode* next;
}QNode, * QueuePrt;//建立链表
typedef struct
{
	QueuePrt front;
	QueuePrt rear;//指向头和尾的两个指针
	
}LinkQueue;//建立队列

2.队列的初始化✨

InitQueue(LinkQueue* q)
{
	q->front = q->rear = (QueuePrt)malloc(sizeof(QNode));//创建头结点
	if (!q->front)
		exit(0);
	q->front->next = NULL;
}//初始队列

其实就是链表中的创建头结点


3. 入队🚗

InsertQueue(LinkQueue *q, Elemtype e)
{
	QueuePrt p;
	p = (QueuePrt)malloc(sizeof(QNode));//创建结点
	if (p == NULL)
		exit(0);
	p->data = e;//赋值
	p->next = NULL;//
	q->rear->next = p;//头指针指向下一个结点
	q->rear = p;
}

在这里插入图片描述


4.出队🚅

DeletQueue(LinkQueue* q, Elemtype* e)
{
	QueuePrt p;
	if (q->front == q->rear)
		return 0;
	*e = p->data;
	q->front->next = p->next;
	if (q->rear == p)
		q->rear = q->front;
	free(p);
}

5.清空与销毁🆘

DesteoyQueue(LinkQueue* q)
{
	while (q->rear = q->front->next)
	{
		free(q->front);
		q->front = q->rear;
	}
}


总结🎆🎆🎆

队列是一种先进先出的线性表。它只允许在表的一端进行插人, 而在另一端进行删除。队列也有两种存储表示,顺序表示(循环队列)和链式表示( 链队)。队列的主要操作是进队和出队,对于顺序表示的循环队列的进队和出队操作要注意判断队满或队空。凡是涉及队头或队尾指针的修改都要将其对MAXQSIZE求模。

#include<stdio.h>
#include<stdlib.h>
typedef int Elemtype;//定义类型
typedef struct Qnode
{
	Elemtype data;
	struct Qnode* next;
}QNode, * QueuePrt;//建立链表
typedef struct
{
	QueuePrt front;
	QueuePrt rear;//指向头和尾的两个指针
	
}LinkQueue;//建立队列
InitQueue(LinkQueue* q)
{
	q->front = q->rear = (QueuePrt)malloc(sizeof(QNode));//创建头结点
	if (!q->front)
		exit(0);
	q->front->next = NULL;
}//初始队列
InsertQueue(LinkQueue *q, Elemtype e)
{
	QueuePrt p;
	p = (QueuePrt)malloc(sizeof(QNode));//创建结点
	if (p == NULL)
		exit(0);
	p->data = e;//赋值
	p->next = NULL;//
	q->rear->next = p;//头指针指向下一个结点
	q->rear = p;
}
DeletQueue(LinkQueue* q, Elemtype* e)
{
	QueuePrt p;
	if (q->front == q->rear)
		return 0;
	*e = p->data;
	q->front->next = p->next;
	if (q->rear == p)
		q->rear = q->front;
	free(p);
}
DesteoyQueue(LinkQueue* q)
{
	while (q->rear = q->front->next)
	{
		free(q->front);
		q->front = q->rear;
	}
}

(文章中图片与部分内容来源与网络,如有侵权请联系删除)
在这里插入图片描述

  • 48
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 40
    评论
评论 40
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

许思王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值