【数据结构】链表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的支持也最为灵活、全面;不足之处,就是编码复杂度较高。 …...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...