数据结构——队列(链表实现)

一、队列的特点

先进先出

二、队列的代码

typedef int QDataType;// 链式结构:表示队列 
typedef struct QListNode
{struct QListNode* next;QDataType data;
}QNode;// 队列的结构 
typedef struct Queue
{QNode* front; //指向队列的第一个结点QNode* rear;//指向队列的最后一个结点int size;//记录队列中一共有几个元素
}Queue;// 初始化队列 
void QueueInit(Queue* q);
// 队尾入队列 
void QueuePush(Queue* q, QDataType data);
// 队头出队列 
void QueuePop(Queue* q);
// 获取队列头部元素 
QDataType QueueFront(Queue* q);
// 获取队列队尾元素 
QDataType QueueBack(Queue* q);
// 获取队列中有效元素个数 
int QueueSize(Queue* q);
// 检测队列是否为空,如果为空返回非零结果,如果非空返回0 
int QueueEmpty(Queue* q);
// 销毁队列 
void QueueDestroy(Queue* q);// 初始化队列 
void QueueInit(Queue* q)
{assert(q);q->front = NULL;  //初始化为NULLq->rear = NULL;//初始化为NULLq->size = 0;  //初始化个数为0
}// 队尾入队列 
void QueuePush(Queue* q, QDataType data)
{assert(q);QNode* newnode = (QNode*)malloc(sizeof(QNode));//申请新的结点if (newnode == NULL){perror("malloc fail");return;}newnode->data = data; newnode->next = NULL;if (q->front == NULL)  //如果front指针指向的是NULL,说明插入前队列是空队列{q->front = newnode;q->rear = newnode;}else        //front指向的不是NULL,说明不是空队列{q->rear->next = newnode;q->rear = newnode;}q->size++;  //插入完,个数加1
}// 队头出队列 
void QueuePop(Queue* q)//出队就是头删
{assert(q);assert(q->size != 0);//队列不为空QNode* head = q->front;  //找到头结点if (head->next == NULL)//如果出队之前,前队列只有一个结点  {free(head);   //释放头结点,后front 和rear都要指向NULL,表示现在是空队列head = NULL;   q->front = q->rear = NULL;q->size = 0;     //个数置为0return; }else   //出队前,队列有两个及其以上的结点数{QNode* del = head;  head = head->next; //更新头结点free(del);  del = NULL;q->front = head;   //将front 指向更新后的头结点q->size--;//个数减1}
}// 获取队列头部元素 
QDataType QueueFront(Queue* q)
{assert(q);return q->front->data;
}// 获取队列队尾元素 
QDataType QueueBack(Queue* q)
{assert(q);return q->rear->data;
}// 获取队列中有效元素个数 
int QueueSize(Queue* q)
{assert(q);return q->size;
}// 检测队列是否为空,如果为空返回非零结果,如果非空返回0 
int QueueEmpty(Queue* q)
{assert(q);if (q->front == NULL)//队列为空,返回1return 1;elsereturn 0;
}// 销毁队列 
void QueueDestroy(Queue* q)
{assert(q);QNode* del = q->front;  //如果是空队列,就直接返回NULL,不要释放结点if (del == NULL){;}else{QNode* cur = del->next;while (del != NULL)    //逐个释放结点{free(del);del = cur;if (cur != NULL)cur = cur->next;}}//队头指针和队尾指针都是要置NULL的,size都是要置为0q->front = q->rear = NULL;q->size = 0;
}

三、队列的函数测试

1.取队头函数 QueueFront

int main()
{Queue Q;QueueInit(&Q);// 初始化队列 QueuePush(&Q, 1);// 队尾入队列 QueuePush(&Q, 2);// 队尾入队列 QueuePush(&Q, 3);// 队尾入队列 QueuePush(&Q,4);// 队尾入队列 QDataType x= QueueFront(&Q);// 获取队列头部元素 
printf("队头元素是%d \n", x);QueueDestroy(&Q);// 销毁队列return 0;
}

结果:

 

2.取队尾函数QueueBack

int main()
{Queue Q;QueueInit(&Q);// 初始化队列 QueuePush(&Q, 1);// 队尾入队列 QueuePush(&Q, 2);// 队尾入队列 QueuePush(&Q, 3);// 队尾入队列 QueuePush(&Q,4);// 队尾入队列 QDataType y= QueueBack(&Q); // 获取队列队尾元素 printf("队尾元素是%d \n", y);QueueDestroy(&Q);// 销毁队列return 0;
}

 结果:

3.求队列中元素个数 函数 QueueSize(&Q)

int main()
{Queue Q;QueueInit(&Q);// 初始化队列 QueuePush(&Q, 1);// 队尾入队列 QueuePush(&Q, 2);// 队尾入队列 QueuePush(&Q, 3);// 队尾入队列 QueuePush(&Q,4);// 队尾入队列 int z= QueueSize(&Q); // 获取队列中有效元素个数 
printf("一共有%d个成员 \n", z);QueueDestroy(&Q);// 销毁队列return 0;
}

 结果;

 4.出队函数QueuePop(头删)

int main()
{Queue Q;QueueInit(&Q);// 初始化队列 QueuePush(&Q, 1);// 队尾入队列 QueuePush(&Q, 2);// 队尾入队列 QueuePush(&Q, 3);// 队尾入队列 QueuePush(&Q,4);// 队尾入队列 QueuePop(&Q);// 队头出队列 
QueuePop(&Q);// 队头出队列 while (!QueueEmpty(&Q))
{printf("%d ", QueueFront(&Q));QueuePop(&Q);
}return 0;
}

结果:

原来 1 2 3 4 入队  出队两次, 变成  3 4 .

 

5.判断队列是否为空的函数QueueEmpty(不为空就会依次出队)

int main()
{Queue Q;QueueInit(&Q);// 初始化队列 QueuePush(&Q, 1);// 队尾入队列 QueuePush(&Q, 2);// 队尾入队列 QueuePush(&Q, 3);// 队尾入队列 QueuePush(&Q,4);// 队尾入队列 while (!QueueEmpty(&Q))  //队列不为空,就会依次出队{printf("%d ", QueueFront(&Q));QueuePop(&Q);//依次出队}printf("所有成员出完队后\n");int w= QueueEmpty(&Q);
if (w != 0)printf("队列已经空了");return 0;
}

结果:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/702309.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 生态与工具

各位大佬好 ,这里是阿川的博客 , 祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 目录 Linux生态简介:Linux工具lrzsz&#xff…

Python100个库分享第23个—wordcloud(词云图)

目录 专栏导读库的介绍库的安装基础使用1:将TXT文本转为词云图基础使用2:使用自定义字体和形状基础使用3:中文词云图停用词(中英文版)-代码是中文版总结 专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题&#xff0…

FullCalendar日历组件集成实战(3)

背景 有一些应用系统或应用功能,如日程管理、任务管理需要使用到日历组件。虽然Element Plus也提供了日历组件,但功能比较简单,用来做数据展现勉强可用。但如果需要进行复杂的数据展示,以及互动操作如通过点击添加事件&#xff0…

通用人工智能将如何重塑未来

通用人工智能(AGI)是一种人工智能,具有与人类一样的获取知识、应用知识解决问题和理解能力。与专门处理受限任务的狭义人工智能系统不同,AGI寻求发展先进的认知技能,以促进在不同情况下完成复杂任务。AGI是一种人工智能,试图模仿人…

Java基于SSM的在线课堂微信小程序【附源码、文档】

博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&#x1f3…

直流无刷电机控制(一)六步换相(有感霍尔)附六步换相实现代码

直流无刷电机概述 直流无刷电机的转子为永磁铁,定子为换相线圈,有别于有刷电机通过电刷或者换向器换相,无刷电机通过控制器电子换相。 极对数 直流无刷电机采用永磁铁作为转子,一对NS磁极为一极对,为了使电机运转更…

等保测评二级有哪些标准

等级保护测评(等保测评)是中国的一项网络安全标准,旨在评估和确保关键信息基础设施的安全。二级等保测评是适用于一般级别的信息系统,这些系统一旦受损,可能会对社会秩序、公共利益和公民权利造成一定程度的影响。 二级…

05-13 周一 量化是什么

05-13 周一 量化是什么 时间版本修改人描述2024年5月13日11:27:25V0.1宋全恒新建文档2024年5月14日16:21:20V1.0宋全恒了解 简介 神经网络在运行时有较高的计算成本,而且随着大模型时代的到来,知识由一个巨大的LLM存储,为了获取知识&#xf…

Cow Exhibition G的来龙去脉

[USACO03FALL] Cow Exhibition G - 洛谷 曲折经过 爆搜 一开始没什么好的想法&#xff0c;就针对每头奶牛去or不去进行了爆搜。 #include <cstdio> #include <algorithm> using namespace std;#define maxn 405 int iq[maxn], eq[maxn]; int ans; int n;void d…

【C++初阶】第十一站:list的介绍及使用

目录 list的介绍及使用 1.list的含义 2.list的介绍 3.list的使用 1.list的构造 2.list iterator的使用 3.list capacity 4.list element access 5 list modifiers 尾插尾删 和 头插头删 insert 和 erase resize swap clear 6.list sort and reverse 7.list copy vector copy li…

如何配置https端口?快解析https端口配置教程

https是在http的基础上加入了SSL128位加密&#xff0c;可使网站更加安全&#xff0c;大家都知道http协议使用的是80端口&#xff0c;而https使用的是443端口。起初一些网上银行使用https协议&#xff0c;用户必须安装证书才能正常浏览银行网站&#xff1b;后来是苹果公司强制要…

3、架构-事务处理

目录 概述 场景事例 本地事务 实现原子性和持久性 实现隔离性 概述 事务处理几乎在每一个信息系统中都会涉及&#xff0c;它存在的意义是为 了保证系统中所有的数据都是符合期望的&#xff0c;且相互关联的数据之间不 会产生矛盾&#xff0c;即数据状态的一致性&#xff0…