【数据结构】链表C++编写的,它定义了一个链表,并实现了一些基本的链表操作,如创建新节点、插入节点、清空链表、输出链表以及查找节点
// 引入标准输入输出流库,用于输出操作
#include <iostream>
// 引入标准库中的stdlib,包含了rand()函数和其他相关函数
#include <cstdlib>
// 引入标准库中的time,包含了time()函数和其他相关函数
#include <ctime> // 定义常量DL为3,表示链表每个节点占用的字符宽度
#define DL 3 // 使用宏定义一个字符串化运算符,用于将数字转化为字符串
#define STR(n) #n
// 使用宏定义一个格式化字符串,用于输出特定长度的整数,例如"%3d"表示输出的整数占用三个字符长度
#define DIGIT_LEN_STR(n) "%" STR(n) "d" // 定义一个结构体Node,表示链表中的节点
struct Node { int data; // 节点的数据域,存储节点的值 Node* next; // 指向下一个节点的指针
}; // 定义一个函数,用于创建一个新的节点,并返回该节点的指针
Node* getNewNode(int val) { // 动态分配一个新的Node内存空间,并返回其指针 Node* p = new Node; // 设置新节点的数据域为传入的值 p->data = val; // 将新节点的next指针设置为nullptr,表示该节点为链表的末尾 p->next = nullptr; // 返回新节点的指针 return p;
} // 定义一个函数,用于在链表的指定位置插入一个新的节点
Node* insert(Node* head, int pos, int val) { // 创建一个新的头节点new_head,并创建一个新的节点node Node new_head, *p = &new_head, *node = getNewNode(val); // 将new_head的next指针指向当前的head,形成一个新的链表 new_head.next = head; // 通过循环移动p指针到指定位置的前一个节点 for (int i = 0; i < pos; i++) { p = p->next; } // 将node的next指针指向p的下一个节点,实现插入操作 node->next = p->next; // 将p的下一个节点设置为node,完成插入操作 p->next = node; // 返回新的链表的头节点的指针 return new_head.next;
} // 定义一个函数,用于清空链表中的所有节点,释放其内存空间
void clear(Node* head) { // 如果链表为空,则直接返回 if (head == nullptr) { return; } // 定义两个指针p和q,p用于遍历链表,q用于保存下一个节点 Node *p = head, *q; // 当p非空时,执行以下操作 while (p) { // 保存p的下一个节点为q q = p->next; // 释放p的内存空间 delete p; // 将p移动到下一个节点 p = q; }
} // 输出链表函数开始
void output_linklist(Node* head, int flag = 0) { // 初始化计数器n为0 int n = 0; // 遍历链表,计算链表中节点的数量,并累加到n中 for (Node* p = head; p; p = p->next) { n += 1; } // 输出每行的前缀,表示节点的位置,使用特定长度的整数格式化字符串输出n的值,并在后面加上空格 for (int i = 0; i < n; i++) { std::cout << i << " "; } // 输出换行符,表示一行的结束 std::cout << std::endl; // 遍历链表,输出每个节点的值和它连接的下一个节点,使用字符串化运算符将整数转化为字符串并输出,最后输出箭头符号"->"表示连接关系 for (Node* p = head; p; p = p->next) { std::cout << p->data << "->"; } // 输出换行符,表示一行的结束 std::cout << std::endl; // 如果flag等于0,则输出一个额外的换行符 if (flag == 0) { std::cout << std::endl; } // 输出链表函数结束
}
// 定义一个函数,用于在链表中查找指定值的节点
int find(Node* head, int val) { // 定义一个指针p,指向链表的头节点 Node* p = head; // 初始化计数器n为0 int n = 0; // 遍历链表,直到p为空(链表结束) while (p) { // 如果当前节点的值等于目标值val if (p->data == val) { // 调用output_linklist函数输出整个链表,参数为head和1(表示需要输出找到的节点) output_linklist(head, 1); // 计算找到的节点在链表中的位置,长度为n*(DL+2)+2 int len = n * (DL + 2) + 2; // 输出一些空格,用于画出一个矩形框来标记找到的节点 for (int i = 0; i < len; i++) std::cout << " "; // 输出一个竖线,用于标记找到的节点在矩形框中的位置 std::cout << "^\n"; // 再输出一些空格,用于画出矩形框的底部 for (int i = 0; i < len; i++) std::cout << " "; // 输出一个竖线,用于标记矩形框的底部 std::cout << "|\n"; // 如果找到目标值,则返回1,表示成功找到 return 1; } // 每遍历一个节点,计数器n加1 n += 1; // 将指针p移动到下一个节点 p = p->next; } // 如果未找到目标值,则返回0,表示未找到 return 0;
} // 主函数开始
int main() { // 使用当前时间作为随机数种子,保证每次运行程序时生成的随机数不同 srand(time(0)); // 定义常量MAX_OP为7
#define MAX_OP 7 // 初始化一个空的链表,头节点为nullptr Node* head = nullptr; // 循环执行MAX_OP次操作,每次插入一个随机位置的随机值节点到链表中 for (int i = 0; i < MAX_OP; i++) { // 生成一个随机位置(范围为i+1,保证位置从0开始)和一个随机值(范围为0-99) int pos = rand() % (i + 1), val = rand() % 100; // 输出插入操作的信息 std::cout << "insert " << val << " at " << pos << " to linklist" << std::endl; // 将新节点插入到指定位置,并更新头节点指针head head = insert(head, pos, val); // 输出当前链表的内容 output_linklist(head); } // 从标准输入中读取一个整数val int val; while (std::cin >> val) { // 在链表中查找值为val的节点,如果没有找到则返回0,表示未找到 if (!find(head, val)) { // 如果未找到,则输出not found信息 std::cout << "not found" << std::endl; } } // 清空链表,释放内存空间 clear(head); // 主函数结束,返回0表示程序正常退出 return 0;
}
这段代码实现了一个简单的链表数据结构,并提供了插入、查找和输出链表的功能。
首先,代码中定义了一些宏,其中DL
被定义为3,用于表示链表节点中的整数占用的位数。STR(n)
用于将一个数值表达式n
转换为字符串,DIGIT_LEN_STR(n)
用于计算一个整数的位数并转换为字符串。
接下来,定义了一个结构体Node
,表示链表的节点。每个节点包含一个整数数据成员data
和一个指向下一个节点的指针next
。
然后,定义了一个函数getNewNode(int val)
,用于创建一个新的节点,并初始化其数据成员为给定的值val
,并将指针next
初始化为nullptr
。
接下来,定义了函数insert(Node* head, int pos, int val)
,用于在链表中插入一个新的节点。该函数首先创建一个新的节点,然后使用一个临时头节点new_head
来处理插入位置。它通过循环遍历链表,找到指定位置的前一个节点,然后将新节点插入到该节点之后。最后返回更新后的链表头节点。
接下来,定义了函数clear(Node* head)
,用于清空链表。该函数通过遍历链表并逐个删除节点来释放内存空间。
接下来,定义了函数output_linklist(Node* head, int flag = 0)
,用于输出链表的内容。该函数首先计算链表的长度,然后依次输出每个节点的数据和指向下一个节点的箭头符号。如果flag
的值为0,则在最后输出一个换行符。
接下来,定义了函数find(Node* head, int val)
,用于在链表中查找指定的值。该函数遍历链表,如果找到了与给定值相等的节点,则输出该节点及其后的所有节点,并在其前面输出一个标记符号"^"和"|",然后返回1表示找到了目标值。如果遍历完整个链表都没有找到目标值,则返回0表示未找到。
最后,在主函数中,首先使用随机数生成器初始化随机数种子,然后通过循环随机生成插入操作和输出操作。每次循环中,随机生成一个插入位置和插入的值,然后调用insert
函数将新节点插入到指定位置,并输出更新后的链表内容。循环结束后,从标准输入中读取一个整数,然后调用find
函数在链表中查找该整数。如果找到了目标值,则返回1;否则返回0,表示未找到。
总结起来,这段代码实现了一个简单的链表数据结构,并提供了插入、查找和输出链表的功能。
运行结果
相关文章:

【数据结构】链表C++编写的,它定义了一个链表,并实现了一些基本的链表操作,如创建新节点、插入节点、清空链表、输出链表以及查找节点
// 引入标准输入输出流库,用于输出操作 #include <iostream> // 引入标准库中的stdlib,包含了rand()函数和其他相关函数 #include <cstdlib> // 引入标准库中的time,包含了time()函数和其他相关函数 #include <ctim…...

浏览器面试题
浏览器面试题 1.常见的浏览器内核有哪些?2.浏览器的主要组成部分有哪些?3.说一说从输入URL到页面呈现发生了什么?4.浏览器重绘域重排的区别?5.CSS加载会阻塞DOM吗?6.JS会阻塞页面吗?7.说一说浏览器的缓存机…...
Java Controller层异常处理示例【含面试题】
AI绘画关于SD,MJ,GPT,SDXL百科全书 面试题分享点我直达 2023Python面试题 2023最新面试合集链接 2023大厂面试题PDF 面试题PDF版本 java、python面试题 项目实战:AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI…...

通过Git Bash将本地文件上传到本地github
1. 新建一个仓库( Repository) 1.1登录Github,点击个人头像,点击Your repositories,点击New。 1.2 填写信息 Repository name: 仓库名称 Description(可选): 仓库描述介绍,不是必填项目。~~建议填写上哦!…...

继承的笔记
继承 对象代表什么, 就得封装对应的数据, 并提供数据对应的行为 对于两种不同的类, 但是具有很多共同的属性的时候我们就想着用继承, 我们可以将共同的属性放置在一个类中, 然后, 只需要新建两个类, 继承共有的类, 然后单独写自己的属性特点 继承类 Java 中提供了一个关键字…...
Android7.1 ROOT权限的获取
修改文件: system/extras/su/su.c system/core/include/private/android_filesystem_config.h system/core/libcutils/fs_config.c frameworks/base/core/jni/com_android_internal_os_Zygote.cpp frameworks/base/cmds/app_process/app_main.cpp device/qcom…...

几个好用的数据标注软件labelme、CVAT及LabelImage
我们使用yolov3、yolov4、yolov5、yolov8等训练自己的权重时,需要有大量标注好的数据集,这里有几个好用的数据标注软件labelme、CVAT及LabelImage 一、labelme labelme:https://github.com/wkentaro/labelme 这个软件用的比较多,…...

VSCode学习笔记一:添加代码模板
一目了然 1 简述2 设置模板3 Global Snippets file示例 1 简述 问:为什么要设置代码模板? 答:编程语言是有个性的,不同语言的演讲风格是不一样的。 旁白:我不懂?! 问:为什么要设置…...

Linux下修改jar包中的配置文件application.conf
文件位置 jar包文件工程目录 打包后解压jar包目录 提取和上传 jar tf XXX.jar # 获取包内文件 application.conf是jar包的配置文件,如果修改需要 提取文件 jar xf my-app.jar application.conf 修改后上传文件 jar uf my-app.jar application.conf...

【python绘图—colorbar操作学习】
文章目录 Colorbar的作用Colorbar的操作截取cmap拼接cmap双刻度列colorbar 引用 Colorbar的作用 Colorbar(颜色条)在绘图中的作用非常重要,它主要用于以下几个方面: 表示数据范围: Colorbar可以显示图中的颜色映射范围…...

Python+Appium自动化测试-编写自动化脚本
之前已经讲述怎样手动使用appium-desktop启动测试机上的app,但我们实际跑自动化脚本的过程中,是需要用脚本调用appium启动app的,接下来就尝试写Python脚本启动app并登陆app。环境为Windows10 Python3.7 appium1.18.0 Android手机 今日头条…...

AMEYA360|ROHM罗姆首次推出硅电容器BTD1RVFL系列
全球知名半导体制造商ROHM(总部位于日本京都市)新开发出在智能手机和可穿戴设备等领域应用日益广泛的硅电容器。利用ROHM多年来积累的硅半导体加工技术,新产品同时实现了更小的尺寸和更高的性能。 随着智能手机等应用的功能增加和性能提升,业界对于支持更…...
Linux发散小知识
linux/unix哲学:KISS Keep It Simple and Stuid。 "提供一套机制,而不是策略",“万般皆文本,四处用脚本” unix的数据流追求简单化、通用性、可视性、设备无关,二进制肯定无法做到这些,因此文本…...

GTS 中testPeakPssOfAllApps fail 详解
0. 前言 GTS 在测试 case armeabi-v7a GtsMemoryHostTestCases 的时候出现下面异常,本文总结一下。 com.google.android.memory.gts.AllAppsMemoryHostTest#testPeakPssOfAllApps 1. error log 09-14 10:16:34 I/TestFailureListener: FailureListener.testFaile…...
linux查看远程仓库的分支
在 Linux 终端中,您可以使用 git 命令来查看远程仓库的分支。git 是版本控制系统,用于管理代码的版本和协作开发。以下是查看远程仓库分支的方法: 查看所有远程分支: git ls-remote <remote_repository_url> 这个命令会显示…...

【Linux常用命令】
编程不良人 Linux 笔记 一、防火墙相关 1、查看防火墙状态 systemctl status flrewalld2、如果防火墙是开启状态的,需要关闭 systemctl stop firewalld3、永久行关闭操作(禁止开机自启动) 因为防火默认是开启状态的,如果只是手…...
QString类与整型,浮点数互转
本文介绍QString类与整型,浮点数之间的相互转换。 1.QString类转整型 QString类转整型(包含2进制,8进制,16进制),可以使用QString的toInt()函数。 QString str("1234"); bool bOK false; int…...

基于STM32F407ZET6的环境温湿度监控系统(粤嵌GEC-M4)
注意使用事项: 开发板如下 由于外部晶振是8M,需要修改setup和stm32f4头文件的晶振值。 操作如下: system_stm32f4xx.c的254行 #define PLL_M 8stm32f4xx.h的127行 #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the Ex…...

2023年五一杯数学建模A题无人机定点投放问题求解全过程论文及程序
2023年五一杯数学建模 A题 无人机定点投放问题 原题再现: 随着科学技术的不断发展,无人机在许多领域都有着广泛的应用。对于空中执行定点投放任务的无人机,其投放精度不仅依赖于无人机的操作技术,而且还与无人机执行任务时所处状…...

Redis 7 第九讲 微服务集成Redis 应用篇
Jedis 理论 Jedis是redis的java版本的客户端实现,使用Jedis提供的Java API对Redis进行操作,是Redis官方推崇的方式;并且,使用Jedis提供的对Redis的支持也最为灵活、全面;不足之处,就是编码复杂度较高。 …...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

PH热榜 | 2025-06-08
1. Thiings 标语:一套超过1900个免费AI生成的3D图标集合 介绍:Thiings是一个不断扩展的免费AI生成3D图标库,目前已有超过1900个图标。你可以按照主题浏览,生成自己的图标,或者下载整个图标集。所有图标都可以在个人或…...

高分辨率图像合成归一化流扩展
大家读完觉得有帮助记得关注和点赞!!! 1 摘要 我们提出了STARFlow,一种基于归一化流的可扩展生成模型,它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流(TARFlow&am…...

Element-Plus:popconfirm与tooltip一起使用不生效?
你们好,我是金金金。 场景 我正在使用Element-plus组件库当中的el-popconfirm和el-tooltip,产品要求是两个需要结合一起使用,也就是鼠标悬浮上去有提示文字,并且点击之后需要出现气泡确认框 代码 <el-popconfirm title"是…...