C++学习笔记(34)

三十六、队列
示例:
#include <iostream>
using namespace std;
typedef int ElemType; // 自定义队列的数据元素为整数。
struct LNode
{
ElemType data; // 存储队列中的元素。
struct LNode* next; // next 指针。
};
struct LinkQueue
{
LNode* head,*tail; // 队列的头指针和尾指针。
};
// 初始化队列。
bool InitQueue(LinkQueue& QQ)
{
QQ.head = new (std::nothrow) LNode; // 分配头结点。
if (QQ.head == nullptr) return false; // 内存不足,返回失败。
QQ.head->next = nullptr; // 头结点的下一结点暂时不存在,置空。
QQ.tail = QQ.head; // 尾指针指向头结点。
return true;
}
// 销毁队列 QQ。
void DestroyQueue(LinkQueue& QQ)
{
LNode* tmp;
while (QQ.head != nullptr)
{
tmp = QQ.head->next; // tmp 保存下一结点的地址。
delete QQ.head; // 释放当前结点。
QQ.head = tmp; // 指针移动到下一结点。
}
}
// 元素入队。
bool InQueue(LinkQueue& QQ, const ElemType& ee)
{
if (QQ.head == nullptr) { cout << "队列未初始化。\n"; return false; }
LNode* tmp = new (std::nothrow) LNode; // 分配一个新结点。
if (tmp == nullptr) return false;
tmp->data = ee; // 把元素的值存入新结点。
tmp->next = nullptr;
QQ.tail->next = tmp; // 把 tmp 追加到 QQ.tail 之后。
QQ.tail = tmp; // 重新设置 tail 指针。
return true;
}
// 元素出队。
bool OutQueue(LinkQueue& QQ, ElemType& ee)
{
if (QQ.head == nullptr) { cout << "队列未初始化。\n"; return false; }
if (QQ.head->next == nullptr) { cout << "队列为空。\n"; return false; }
LNode* tmp = QQ.head->next; // tmp 指向第一个结点。
ee = tmp->data; // 把第一个结点的数据保存到 ee 中。
QQ.head->next = tmp->next; // 头结点的 next 指针指向第二个结点。
// 如果出队的是最后一个结点。
if (tmp == QQ.tail) QQ.tail = QQ.head;
delete tmp; // 释放已出队的结点。
return true;
}
// 显示队列中全部的元素。
void PrintQueue(LinkQueue& QQ)
{
if (QQ.head == nullptr) { cout << "队列未初始化。\n"; return ; }
LNode* pp = QQ.head->next; // 从第 1 个数据结点开始。
while (pp != NULL)
{
cout << pp->data << " " ;
pp = pp->next;
}
cout << endl;
}
// 求队列的长度。
int Length(LinkQueue& QQ)
{
if (QQ.head == nullptr) { cout << "队列未初始化。\n"; return false; }
LNode* pp = QQ.head->next; // 头结点不算,从第 1 个结点开始。
int length = 0;
while (pp != nullptr) { pp = pp->next; length++; }
return length;
}
// 清空队列。
void Clear(LinkQueue& QQ)
{
if (QQ.head == nullptr) { cout << "队列未初始化。\n"; return; }
// 清空队列是指释放链表全部的数据结点,但保留头结点。
LNode* tmp = QQ.head->next, * tmpnext;
while (tmp != nullptr)
{
tmpnext = tmp->next; // tmpnext 保存下一结点的地址。
delete tmp; // 释放当前结点。
tmp = tmpnext; // tmp 指针移动到下一结点。
}
QQ.head->next = nullptr;
QQ.tail = QQ.head; // 尾指针指向头结点。
}
int main()
{
LinkQueue QQ; // 创建队列。
memset(&QQ, 0, sizeof(QQ));
InitQueue(QQ); // 初始化队列。
cout << "元素(1、2、3、4、5)入队。\n";
InQueue(QQ, 1);
InQueue(QQ, 2);
InQueue(QQ, 3);
InQueue(QQ, 4);
InQueue(QQ, 5);
cout << "队列的长度是:" << Length(QQ) << "。\n";
cout << "队列中的元素是:";
PrintQueue(QQ);
ElemType ee; // 创建一个数据元素。
while (OutQueue(QQ, ee))
cout << "出队的元素值为" << ee << endl;
cout << "元素(11、12、13、14、15)入队。\n";
InQueue(QQ, 11);
InQueue(QQ, 12);
InQueue(QQ, 13);
InQueue(QQ, 14);
InQueue(QQ, 15);
cout << "队列的长度是:" << Length(QQ) << "。\n";
cout << "队列中的元素是:";
PrintQueue(QQ);
while (OutQueue(QQ, ee))
cout << "出队的元素值为" << ee << endl;
DestroyQueue(QQ); // 销毁队列 QQ。
}
四十、冒泡排序
示例:
#include <iostream>
using namespace std;
// 采用两层循环实现的方法。
// 参数 arr 是待排序数组的首地址,len 是数组元素的个数。
void bubblesort1(int arr[], int len)
{
if (len < 2) return; // 数组小于 2 个元素不需要排序。
bool ifswap=false; // 记录每轮排序过程中是否交换过元素,false-未交换;true-有交换。
// 44,3,38,5,47,15,36,26,27,2,46,4,19,50,48
for (int ii = len - 1; ii > 0; ii--) // 一共进行 len-1 趟比较。
{
ifswap = false;
for (int jj = 0; jj < ii; jj++) // 每轮只需要比较 0......ii 之间的元素,ii 之后的元素是
已经排序好的。
{
if (arr[jj] > arr[jj + 1]) // 如果前面的元素大于后面的元素,则交换它位的
位置。
{
swap(arr[jj], arr[jj + 1]); // 交换两个元素的位置。
ifswap = true;
}
}
if (ifswap == false) return; // 如果这一轮没有交换过元素,说明数组已经是有序的
了。
}
}
// 采用递归实现的方法。
// 参数 arr 是待排序数组的首地址,len 是数组元素的个数。
void bubblesort2(int arr[], int len)
{
if (len < 2) return; // 数组小于 2 个元素不需要排序。
bool ifswap = false; // 记录每轮排序过程中是否交换过元素,false-未交换;true-有交换。
for (int jj = 0; jj < len - 1; jj++) // 每趟只需要比较 0......len-1 之间的元素,len-1 之后的元
素是已经排序好的。
{
if (arr[jj] > arr[jj + 1]) // 如果前面的元素大于后面的元素,则交换它位的
位置。
{
swap(arr[jj], arr[jj + 1]); // 交换两个元素的位置。
ifswap = true;
}
}
if (ifswap == false) return; // 如果这一轮没有交换过元素,说明数组已经是有序的了。
bubblesort2(arr, --len);
}
int main(int argc, char* argv[])
{
int arr[] = { 44,3,38,5,47,15,36,26,27,2,46,4,19,50,48 }; // 待排序的数组。
int len = sizeof(arr) / sizeof(int); // 求数组长度。
//bubblesort1(arr, len); // 采用循环的方法。
bubblesort2(arr, len); // 采用递归的方法。
// 显示排序结果。
for (int ii = 0; ii < len; ii++) cout << arr[ii] << " ";
cout << endl;
}
四十一、选择排序
示例(未优化):
#include <iostream>
using namespace std;
// 采用两层循环实现的方法。
// 参数 arr 是待排序数组的首地址,len 是数组元素的个数。
void selectsort1(int arr[], int len)
{
if (len < 2) return; // 数组小于 2 个元素不需要排序。
int iminpos; // 每趟循环选出的最小值的位置(数组的下标)。
// 44,3,38,5,47,15,36,26,27,2,46,4,19,50,48
for (int ii = 0; ii < len - 1; ii++) // 一共进行 len-1 趟比较。
{
iminpos = ii;
for (int jj = ii + 1; jj < len; jj++) // 每趟只需要比较 ii+1......len-1 之间的元素,ii 之前的
元素是已经排序好的。
{
// 找出值更小的元素,记下它的位置。
if (arr[jj] < arr[iminpos]) iminpos = jj;
}
// 如果本趟循环的最小的元素不是起始位置的元素,则交换它们的位置。
if (iminpos != ii) swap(arr[ii], arr[iminpos]);
}
}
// 采用递归实现的方法。
// 参数 arr 是待排序数组的首地址,len 是数组元素的个数。
void selectsort2(int arr[], int len)
{
if (len < 2) return; // 数组小于 2 个元素不需要排序。
int iminpos = 0; // 每趟循环选出的最小值的位置(数组的下标)。
for (int ii = 1; ii < len; ii++)
{
// 找出值更小的元素,记下它的位置。
if (arr[ii] < arr[iminpos]) iminpos = ii;
}
// 如果本趟循环的最小的元素不是起始位置的元素,则交换它们的位置。
if (iminpos != 0) swap(arr[0], arr[iminpos]);
selectsort2(arr + 1, --len);
}
int main(int argc, char* argv[])
{
int arr[] = { 44,3,38,5,47,15,36,26,27,2,46,4,19,50,48 }; // 待排序的数组。
int len = sizeof(arr) / sizeof(int); // 求数组长度。
selectsort1(arr, len); // 采用循环的方法。
//selectsort2(arr, len); // 采用递归的方法。
// 显示排序结果。
for (int ii = 0; ii < len; ii++) cout << arr[ii] << " ";
cout << endl;
}
示例(优化后):
#include <iostream>
using namespace std;
// 采用两层循环实现的方法。
// 参数 arr 是待排序数组的首地址,len 是数组元素的个数。
void selectsort1(int arr[], int len)
{
if (len < 2) return; // 数组小于 2 个元素不需要排序。
int ileft, iright; // 每趟排序的最左和最右的位置。
int iminpos; // 每趟循环选出的最小值的位置(数组的下标)。
int imaxpos; // 每趟循环选出的最大值的位置(数组的下标)。
ileft = 0; iright = len - 1; // ileft 从 0 开始,iright 从 len-1 开始。
while (ileft < iright)
{
iminpos = imaxpos = ileft;
for (int ii = ileft; ii <= iright; ii++) // 每趟循环从 ileft 和 iright 之间选取元素。
{
// 找出值更小的元素,记下它的位置。
if (arr[ii] < arr[iminpos]) iminpos = ii;
// 找出值更大的元素,记下它的位置。
if (arr[ii] > arr[imaxpos]) imaxpos = ii;
}
// 如果本趟循环的最小的元素不是最左边的元素,则交换它们的位置。
if (iminpos != ileft) swap(arr[ileft], arr[iminpos]);
// 如果 imaxpos 的位置是 ileft,在上面的代码中 ileft 已被交换到了 iminpos 的位置。
// 所以 imaxpos 的值要修改为 iminpos。
if (imaxpos == ileft) imaxpos = iminpos;
// 如果本趟循环的最大的元素不是最右边的元素,则交换它们的位置。
if (imaxpos != iright) swap(arr[iright], arr[imaxpos]);
ileft++;
iright--;
}
}
// 采用递归实现的方法。
// 参数 arr 是待排序数组的首地址,len 是数组元素的个数。
void selectsort2(int arr[], int len)
{
if (len < 2) return;
int iminpos = 0; // 每趟循环选出的最小值的位置(数组的下标)。
int imaxpos = 0; // 每趟循环选出的最大值的位置(数组的下标)。
int ileft = 0;
int iright = len - 1;
for (int ii = ileft; ii <= iright; ii++) // 循环从 ileft 和 iright 之间选取元素。
{
// 找出值更小的元素,记下它的位置。
if (arr[ii] < arr[iminpos]) iminpos = ii;
// 找出值更大的元素,记下它的位置。
if (arr[ii] > arr[imaxpos]) imaxpos = ii;
}
// 如果本趟循环的最小的元素不是最左边的元素,则交换它们的位置。
if (iminpos != ileft) swap(arr[ileft], arr[iminpos]);
// 如果 imaxpos 的位置是 ileft,在上面的代码中 ileft 已被交换到了 iminpos 的位置。
// 所以 imaxpos 的值要修改为 iminpos。
if (imaxpos == ileft) imaxpos = iminpos;
// 如果本趟循环的最大的元素不是最右边的元素,则交换它们的位置。
if (imaxpos != iright) swap(arr[iright], arr[imaxpos]);
len = len - 2;
selectsort2(++arr, len);
}
int main(int argc, char* argv[])
{
int arr[] = { 44,3,38,5,47,15,36,26,27,2,46,4,19,50,48 }; // 待排序的数组。
int len = sizeof(arr) / sizeof(int); // 求数组长度。
selectsort1(arr, len); // 采用循环的方法。
//selectsort2(arr, len); // 采用递归的方法。
// 显示排序结果。
for (int ii = 0; ii < len; ii++) cout << arr[ii] << " ";
cout << endl;
}
四十二、插入排序
示例:
#include <iostream>
using namespace std;
// 参数 arr 是待排序数组的首地址,len 是数组元素的个数。
void insertsort(int arr[], int len)
{
if (len < 2) return; // 数组小于 2 个元素不需要排序。
int itmp; // 当前需要排序的元素的值。
for (int ii = 1; ii < len; ii++) // ii 从 1 开始,因为第一个元素不需要排序,就像拿到第一张
牌一样。
{
itmp = arr[ii]; // 待排序元素。
// 从已排序元素的最右边开始,把大于当前排序的元素后移。
int jj; // 需要后移元素的计数器。
for (jj = ii - 1; jj >= 0; jj--)
{
if (arr[jj] <= itmp) break;
arr[jj + 1] = arr[jj]; // 逐个元素后移。
}
arr[jj + 1] = itmp; // 插入当前排序元素。
}
}
int main(int argc, char* argv[])
{
int arr[] = { 44,3,38,5,47,15,36,26,27,2,46,4,19,50,48 }; // 待排序的数组。
int len = sizeof(arr) / sizeof(int); // 求数组长度。
insertsort(arr, len);
// 显示排序结果。
for (int ii = 0; ii < len; ii++) cout << arr[ii] << " ";
cout << endl;
}
 

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

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

相关文章

基于PHP的电脑线上销售系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于phpMySQL的电脑线上销售系…

免费音乐剪辑软件大揭秘:2024 大学生的音乐创作利器

对于音乐爱好者而言&#xff0c;如果你萌生了尝试音乐剪辑的念头&#xff0c;不妨先从探索一些免费工具开始。在此&#xff0c;我愿分享几款我个人体验过的、值得一试的音乐剪辑免费软件&#xff0c;希望能为你的音乐探索之旅增添乐趣与灵感。 1.福晰音频剪辑 链接直达>&g…

免费在线压缩pdf 压缩pdf在线免费 推荐简单好用

压缩pdf在线免费&#xff1f;在日常生活和工作学习中&#xff0c;处理PDF文件是常见任务。但有时PDF文件体积较大&#xff0c;给传输、存储和分享带来不便。因此&#xff0c;学习PDF文件压缩技巧十分必要。压缩PDF文件是指通过技术手段减小文件占用的存储空间&#xff0c;同时尽…

数据保护从现在开始:如何抵御 .[RestoreBackup@cock.li].SRC 勒索病毒

导言 勒索病毒是一种不断演变的网络威胁&#xff0c;.[RestoreBackupcock.li].SRC、[chewbaccacock.li].SRC勒索病毒便是其中一种新型的攻击手段。该病毒通过加密用户文件并要求支付赎金来恢复访问&#xff0c;给个人和企业带来了严重的安全风险和经济损失。本文91数据恢复将探…

Python 从入门到实战23(属性property)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们讨论了类的定义、使用方法的相关知识。今天我们将学…

信息安全数学基础(19)同余式的基本概念及一次同余式

一、同余式概念 同余式是数论中的一个基本概念&#xff0c;用于描述两个数在除以某个数时所得的余数相同的情况。具体地&#xff0c;设m是一个正整数&#xff0c;a和b是两个整数&#xff0c;如果a和b除以m的余数相同&#xff0c;则称a和b模m同余&#xff0c;记作a≡b(mod m)。反…

【有啥问啥】OpenAI o1的思考之前训练扩展定律、后训练扩展定律与推理扩展定律:原理与应用详解

OpenAI o1的思考之前训练扩展定律、后训练扩展定律与推理扩展定律&#xff1a;原理与应用详解 随着深度学习技术的不断发展&#xff0c;模型的规模和复杂度也迅速提升。研究人员发现了模型训练和推理过程中性能变化的规律&#xff0c;这些规律为我们提供了优化模型设计与训练的…

基于微信小程序的剧本杀游玩一体化平台

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于微信小程序JavaSpringBootVueMySQL的剧…

PyQt / PySide + Pywin32 + ctypes 自定义标题栏窗口 + 完全还原 Windows 原生窗口边框特效项目

项目地址&#xff1a; GitHub - github201014/PyQt-NativeWindow: A class of window include nativeEvent, use PySide or PyQt and Pywin32 and ctypesA class of window include nativeEvent, use PySide or PyQt and Pywin32 and ctypes - github201014/PyQt-NativeWindow…

MyBatis 分批次执行(新增,修改,删除)

import com.google.common.collect.Lists;import java.util.Iterator; import java.util.List; import java.util.function.Consumer;/*** Description mybatis分批插入数据使用* Author WangKun* Date 2024/9/19 11:20* Version*/ public class MyBatisSqlUtils {/*** param d…

4G 网络下资源加载失败?一次运营商封禁 IP 的案例分享

在工作中&#xff0c;网络问题是不可避免的挑战之一。最近&#xff0c;我们在项目中遇到了一起网络资源加载异常的问题&#xff1a;某同事在使用 4G 网络连接公司 VPN 时&#xff0c;云服务的前端资源居然无法加载&#xff01;通过一系列的排查和分析&#xff0c;我们发现问题的…

DataFrame生成excel后为什么多了一行数字

问题描述 python查询数据生成excel文件&#xff0c;生成的excel多了第一行数字索引&#xff0c;1,2,3,4,5...... 代码&#xff1a; df pd.DataFrame(data)df.to_excel(filename, sheet_name用户信息表, indexFalse) 解决&#xff1a; 原理也很简单&#xff0c;就是设置个参…

高德地图JS API AMap.MouseTool绘制

fang &#x1f916; 作者简介&#xff1a;水煮白菜王 &#xff0c;一位资深前端劝退师 &#x1f47b; &#x1f440; 文章专栏&#xff1a; 高德AMap专栏 &#xff0c;记录一下平时在博客写作中&#xff0c;总结出的一些开发技巧✍。 感谢支持&#x1f495;&#x1f495;&#…

本地搭建我的世界服务器(JAVA)简单记录

网上参考教程挺多的&#xff0c;踩了不少坑&#xff0c;简单记录一下&#xff0c;我做的是一个私人服务器&#xff0c;就是和朋友3、4个人玩。 笨蛋 MC 开服教程 先放一个比较系统和完整的教程&#xff0c;萌新可用&#xff0c;这个教程很详细&#xff0c;我只是记录一下自己的…

【QT】定时器使用

文章目录 关于 Qt 定时器使用的注意细节总结实例-检查工具使用周期时间是否合理UI设计头文件 remind.h源文件 remind.cpp实现效果 关于 Qt 定时器使用的注意细节总结 一、创建与初始化 使用 QTimer 类来创建定时器。可以在构造函数中指定父对象&#xff0c;确保定时器在正确的…

自动化测试常用函数

目录 一、元素的定位 1、cssSelector 2、xpath &#xff08;1&#xff09;xpath 语法 1、获取HTML页面所有的节点 2、获取HTML页面指定的节点 3、获取一个节点中的直接子节点 4、获取一个节点的父节点 5、实现节点属性的匹配 6、使用指定索引的方式获取对应的节点内容…

【鸿蒙】HarmonyOS NEXT星河入门到实战8-自定义组件-组件通信

目录 1、模块化语法 1.1 模块化基本认知 1.2 默认导出和导入 1.2.1 在ets下新建tools目录 1.2.2 在tools下新建moduls.ets文件 1.2.3 index.ets 1.3 按需导出和导入 1.4 全部导入 2、自定义组件 -基础 2.1 自定义组件 - 基本使用 2.2 自定义组件 -通用样式 2.2.1 et…

大数据Flink(一百二十二):阿里云Flink MySQL连接器介绍

文章目录 阿里云Flink MySQL连接器介绍 一、特色功能 二、​​​​​​​语法结构 三、​​​​​​​​​​​​​​WITH参数 阿里云Flink MySQL连接器介绍 阿里云提供了MySQL连接器&#xff0c;其作为源表时&#xff0c;扮演的就是flink cdc的角色。 一、特色功能 MySQ…

neo4j导入csv数据

neo4j数据可视化实践 手动输入数据 - 官方democsv数据导入准备数据数据处理导入步骤① 导入疾病表格② 导入药物表格③导入疾病-药物关系表格 爬虫的csv文件 手动输入数据 - 官方demo 点击之后&#xff0c;按照左边10张图中的代码&#xff0c;复制粘贴熟悉语法 效果如下 csv数据…

基于JAVA+SpringBoot+Vue的学生干部管理系统

基于JAVASpringBootVue的学生干部管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末附源码下载链接&#x1f345; 哈…