链式队列的基本操作与实现(数据结构与算法)

在这里插入图片描述

链队列的表示与实现如下图:

在这里插入图片描述
代码如下:

#include<iostream>
using namespace std;#define MAXQSIZE 100 //最大队列长度
typedef int QElemType; //typedef struct Qnode
{QElemType data;struct Qnode* next; 
}QNode, *QueuePtr; //队列结点类型、指向队列结点的指针类型typedef struct     //为指向队列结点的指针类型QueuePtr单独建立一个包含队头队尾的结构体
{QueuePtr  front; //队头指针QueuePtr  rear;  //队尾指针
}LinkQueue;       //链式队列定义//初始化链队列:front与rear都指向队头结点,队头结点next指针置空
bool InitQueue(LinkQueue& Q)
{//将队列的头尾指针都指向同一个节点,表示队列为空//C++ 的 new 运算符会在对象不再需要时自动调用析构函数,并释放内存,而 malloc 函数需要手动调用 free 函数来释放内存。Q.front = Q.rear = new QNode;  //Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));if(!Q.front){exit(OVERFLOW);}Q.front->next = NULL; //将队列队头指针置空return true; //初始化完成
}
//链队列判空
bool QueueEmpty(LinkQueue& Q)
{//队头队尾指针指向同一位置(队头结点),队列为空。return Q.front == Q.rear;
}//链队列销毁:从队头结点开始,一次释放所有结点
bool DestoryQueue(LinkQueue& Q)
{QueuePtr temp;   //创建临时指针  指针声明二选一//QNode* temp;  while (Q.front){ //反正rear指针闲置无事,此处可以不额外创建temp,直接将下列temp替换成Q.rear效果一样。temp = Q.front->next; //temp指向队头的下一个结点delete Q.front;  //释放队头结点Q.front = temp;  //更新队头结点}Q.rear = NULL;cout << "队列销毁成功!" << endl;return true; 
}
//链队入队操作,将元素value入队:创建新结点,将元素放入结点数据域、新节点next指针置空、队尾rear指向新结点、更新队尾结点。
bool EnQueue(LinkQueue& Q, QElemType value)
{QueuePtr temp = new QNode; //创建指针型QNode结点,指针指向要插入的结点元素if (!temp)    //创建结点,分配内存要判断是否分配成功{exit(OVERFLOW);}temp->data = value;    //将要插入的元素放入temp结点数据域temp->next = NULL;     //temp结点指针域置空Q.rear->next = temp;   //将队尾指针接上temp结点Q.rear = temp;         //更新队尾结点return true; 
}
//链队的出队:删除队头结点的下一位,头结点不存储数据元素。
//判断链队列是否为空、创建temp指针指向要出栈的元素、删除该结点,将头结点指向删除结点的后继结点,更新队头,若删除的是队尾,则队头队尾指针均指向队头结点。。
bool DeQueue(LinkQueue& Q, QElemType value)
{if (!QueueEmpty(Q))   //若链队列不为空{QueuePtr temp = NULL; //创建指针类型的QNode结点,指针指向新结点if (!temp)  exit(OVERFLOW);//判断新结点内存是否分配成功temp = Q.front->next;//temp指向队头结点下一位即第一位元素value = temp->data;//将temp所指结点的数据保存到value中Q.front->next = temp->next;//更新队头结点if (Q.rear == temp)//如果删除的是最后一个结点(尾结点),尾结点回移{Q.rear = Q.front;//rear、front均指向仅存的头结点Q.front->next = NULL;}delete temp;  //释放出栈元素所占结点空间return true;  //出栈成功}return false; //队列为空
}
//链队的队头元素
bool GetHead(LinkQueue Q)
{if (!QueueEmpty(Q))  //若链队列不为空{return Q.front->next->data;}return false; 
}
//链队列的长度/元素个数
//这里Q不能用'&'引用型传递,否则下方队头指针front的移动会修改原队列front指针。不加引用,就会创建一个副本执行操作,故相比前者会多消耗些内存和时间。也可以创建一个临时指针temp对队列进行遍历,这样即使Q加了&, 也不会影响原链队列。
int QueueLength(LinkQueue Q)
{if (!QueueEmpty(Q))  //若链队列不为空{int count = 0;	     //元素个数/队列长度while (Q.front != Q.rear)//直到{Q.front = Q.front->next;//队头指针后移一位count++; //计数加一}return count; }return false; //队列为空或不存在
}
//遍历输出链队元素
bool QueuePrint(LinkQueue Q)  
{if (!QueueEmpty(Q)){while (Q.front != Q.rear){Q.front = Q.front->next;	  //将链队头指针指向第一个元素结点cout << Q.front->data <<" ";  //输出该结点所指的结点数据}cout << endl;return true; }cout << "队列为空或不存在!";return false;  
}int main()
{LinkQueue Q;//QElemType value;InitQueue(Q);int number = 0;		//入队的元素个数cout << "请输入要入队的元素个数:" << " ";cin >> number; int num = 0;		//入队的数据元素while ((number--) > 0){cin >> num; //输入数据元素EnQueue(Q, num); //将num入队 }cout << "队列输出顺序:";QueuePrint(Q); //遍历输出队列元素cout << "队头元素为:" << GetHead(Q) << endl;cout << "队列长度为:" << QueueLength(Q) << endl;DestoryQueue(Q);//销毁链式队列,释放内存空间QueuePrint(Q); //遍历队列元素system("pause");return 0;
}

结果如下:
在这里插入图片描述

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

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

相关文章

Os-ByteSec

Os-ByteSec 一、主机发现和端口扫描 主机发现&#xff0c;靶机地址192.168.80.144 端口扫描&#xff0c;开放了80、139、445、2525端口 二、信息收集 访问80端口 路径扫描 dirsearch -u "http://192.168.80.144/" -e *访问扫描出来的路径&#xff0c;没有发现…

电子电器架构 —— 车载网关边缘节点路由转发策略

电子电器架构 —— 车载网关边缘节点路由转发策略 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 PS:小细节,本文字数5000+,详细描述了网关在车载框架中的具体性能设置。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无…

Redis:新的3种数据类型Bitmaps、HyperLoglog、Geographic

目录 Bitmaps简介常用命令bitmaps与set比较 HyperLoglog简介命令 Geographic简介命令 Bitmaps 简介 位操作字符串。 现代计算机使用二进制&#xff08;位&#xff09;作为信息的基本单位&#xff0c;1个字节等于8位&#xff0c;例如“abc”字符串是有3个字节组成&#xff0c…

珠海希雷伺服全套(包含算法)方案

下载链接&#xff01;&#xff01;https://mp.weixin.qq.com/s?__bizMzU2OTc4ODA4OA&mid2247555038&idx1&sn939a4ad71582abc1f9e93c4d5526fed9&chksmfcfb0409cb8c8d1f74ce7108e20b0310e7399775367a023638624357644dfa4ae435e41c8768&token207079769&l…

解决:Android TextView 设置斜体后右侧文字被遮挡

一、问题说明 遇到一个比较奇怪的情况&#xff0c;给 TextView 文字设置倾斜后&#xff0c;右侧的文字会被遮挡&#xff0c;感觉这应该是 Android 的一个 bug &#xff01; 上代码&#xff1a; <TextViewandroid:id"id/tv_title"android:layout_width"wra…

文件加密软件哪个好用丨真心推荐丨良心建议

在保护企业文件和数据方面&#xff0c;文件加密软件是一种非常重要的工具。以下是我推荐好用的文件加密软件&#xff0c;以及我的良心建议。 一、WinRAR。WinRAR是一款免费的文件压缩和解压缩工具&#xff0c;同时也提供了强大的文件加密功能。使用WinRAR可以轻松地加密文件夹和…

3D建模基础教程:编辑样条线【子层级】

了解子层级编辑样条线 在3D建模中&#xff0c;样条线是创建各种形状和曲线的重要工具。而编辑样条线是3D建模过程中不可或缺的一部分。今天&#xff0c;我们将一起学习如何编辑样条线&#xff0c;以及了解其子层级的相关知识。 样条线的子层级介绍 样条线的子层级包括&#xff…

KVM Cloud云平台

项目介绍 KVM Cloud 是一款基于Java实现的轻量级私有云平台&#xff0c;旨在帮助中小企业快速实现计算、存储、网络等资源的管理&#xff0c;让企业拥有自己的云平台&#xff0c;包括但不限于如下功能: 1、基于KVM的VM基础功能(创建、启动、停止、重装、webVNC等功能) 2、使用…

Zabbix Proxy分布式监控

目录 Zabbix Proxy简介 实验环境 proxy端配置 1.安装仓库 2.安装zabbix-proxy 3.创建初始数据库 4.导入初始架构和数据&#xff0c;系统将提示您输入新创建的密码 5.编辑配置文件 /etc/zabbix/zabbix_proxy.conf&#xff0c;配置完成后要重启。 agent客户端配置 zabbix…

【容器化】Kubernetes(k8s)

文章目录 概述Docker 的管理痛点什么是 K8s云架构 & 云原生 架构核心组件K8s 的服务注册与发现组件调用流程部署单机版部署主从版本Operator来源拓展阅读 概述 Docker 虽好用&#xff0c;但面对强大的集群&#xff0c;成千上万的容器&#xff0c;突然感觉不香了。 这时候就…

计算机msvcp120.dll丢失?msvcp120.dll丢失5种简单的解决方法分享

你们是否在电脑操作过程中常看到一段类似“msvcp120.dll缺失或损坏”的报错信息&#xff1f;这可能会干扰大家的日常应用程序使用&#xff0c;怎么办呢&#xff1f;别担心&#xff0c;接下来就是一篇详细的步骤来教你如何应对这种情况&#xff0c;让你们的电脑运作如初&#xf…