当前位置: 首页 > news >正文

【数据结构】链表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++编写的,它定义了一个链表,并实现了一些基本的链表操作,如创建新节点、插入节点、清空链表、输出链表以及查找节点

// 引入标准输入输出流库&#xff0c;用于输出操作 #include <iostream> // 引入标准库中的stdlib&#xff0c;包含了rand()函数和其他相关函数 #include <cstdlib> // 引入标准库中的time&#xff0c;包含了time()函数和其他相关函数 #include <ctim…...

浏览器面试题

浏览器面试题 1.常见的浏览器内核有哪些&#xff1f;2.浏览器的主要组成部分有哪些&#xff1f;3.说一说从输入URL到页面呈现发生了什么&#xff1f;4.浏览器重绘域重排的区别&#xff1f;5.CSS加载会阻塞DOM吗&#xff1f;6.JS会阻塞页面吗&#xff1f;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. 新建一个仓库&#xff08; Repository&#xff09; 1.1登录Github&#xff0c;点击个人头像&#xff0c;点击Your repositories&#xff0c;点击New。 1.2 填写信息 Repository name: 仓库名称 Description(可选): 仓库描述介绍,不是必填项目。~~建议填写上哦&#xff01;…...

继承的笔记

继承 对象代表什么, 就得封装对应的数据, 并提供数据对应的行为 对于两种不同的类, 但是具有很多共同的属性的时候我们就想着用继承, 我们可以将共同的属性放置在一个类中, 然后, 只需要新建两个类, 继承共有的类, 然后单独写自己的属性特点 继承类 Java 中提供了一个关键字…...

Android7.1 ROOT权限的获取

修改文件&#xff1a; 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等训练自己的权重时&#xff0c;需要有大量标注好的数据集&#xff0c;这里有几个好用的数据标注软件labelme、CVAT及LabelImage 一、labelme labelme&#xff1a;https://github.com/wkentaro/labelme 这个软件用的比较多&#xff0c…...

VSCode学习笔记一:添加代码模板

一目了然 1 简述2 设置模板3 Global Snippets file示例 1 简述 问&#xff1a;为什么要设置代码模板&#xff1f; 答&#xff1a;编程语言是有个性的&#xff0c;不同语言的演讲风格是不一样的。 旁白&#xff1a;我不懂&#xff1f;&#xff01; 问&#xff1a;为什么要设置…...

Linux下修改jar包中的配置文件application.conf

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

【python绘图—colorbar操作学习】

文章目录 Colorbar的作用Colorbar的操作截取cmap拼接cmap双刻度列colorbar 引用 Colorbar的作用 Colorbar&#xff08;颜色条&#xff09;在绘图中的作用非常重要&#xff0c;它主要用于以下几个方面&#xff1a; 表示数据范围&#xff1a; Colorbar可以显示图中的颜色映射范围…...

Python+Appium自动化测试-编写自动化脚本

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

AMEYA360|ROHM罗姆首次推出硅电容器BTD1RVFL系列

全球知名半导体制造商ROHM(总部位于日本京都市)新开发出在智能手机和可穿戴设备等领域应用日益广泛的硅电容器。利用ROHM多年来积累的硅半导体加工技术&#xff0c;新产品同时实现了更小的尺寸和更高的性能。 随着智能手机等应用的功能增加和性能提升&#xff0c;业界对于支持更…...

Linux发散小知识

linux/unix哲学&#xff1a;KISS Keep It Simple and Stuid。 "提供一套机制&#xff0c;而不是策略"&#xff0c;“万般皆文本&#xff0c;四处用脚本” unix的数据流追求简单化、通用性、可视性、设备无关&#xff0c;二进制肯定无法做到这些&#xff0c;因此文本…...

GTS 中testPeakPssOfAllApps fail 详解

0. 前言 GTS 在测试 case armeabi-v7a GtsMemoryHostTestCases 的时候出现下面异常&#xff0c;本文总结一下。 com.google.android.memory.gts.AllAppsMemoryHostTest#testPeakPssOfAllApps 1. error log 09-14 10:16:34 I/TestFailureListener: FailureListener.testFaile…...

linux查看远程仓库的分支

在 Linux 终端中&#xff0c;您可以使用 git 命令来查看远程仓库的分支。git 是版本控制系统&#xff0c;用于管理代码的版本和协作开发。以下是查看远程仓库分支的方法&#xff1a; 查看所有远程分支&#xff1a; git ls-remote <remote_repository_url> 这个命令会显示…...

【Linux常用命令】

编程不良人 Linux 笔记 一、防火墙相关 1、查看防火墙状态 systemctl status flrewalld2、如果防火墙是开启状态的&#xff0c;需要关闭 systemctl stop firewalld3、永久行关闭操作&#xff08;禁止开机自启动&#xff09; 因为防火默认是开启状态的&#xff0c;如果只是手…...

QString类与整型,浮点数互转

本文介绍QString类与整型&#xff0c;浮点数之间的相互转换。 1.QString类转整型 QString类转整型&#xff08;包含2进制&#xff0c;8进制&#xff0c;16进制&#xff09;&#xff0c;可以使用QString的toInt()函数。 QString str("1234"); bool bOK false; int…...

基于STM32F407ZET6的环境温湿度监控系统(粤嵌GEC-M4)

注意使用事项&#xff1a; 开发板如下 由于外部晶振是8M&#xff0c;需要修改setup和stm32f4头文件的晶振值。 操作如下&#xff1a; system_stm32f4xx.c的254行 #define PLL_M 8stm32f4xx.h的127行 #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the Ex…...

2023年五一杯数学建模A题无人机定点投放问题求解全过程论文及程序

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

Redis 7 第九讲 微服务集成Redis 应用篇

Jedis 理论 Jedis是redis的java版本的客户端实现&#xff0c;使用Jedis提供的Java API对Redis进行操作&#xff0c;是Redis官方推崇的方式&#xff1b;并且&#xff0c;使用Jedis提供的对Redis的支持也最为灵活、全面&#xff1b;不足之处&#xff0c;就是编码复杂度较高。 …...

c++day7

仿照vector手动实现自己的myVector&#xff0c;最主要实现二倍扩容功能 #include <iostream>using namespace std; template <typename T> class Myvector { private:T *start;//起始指针T *end;//数组末尾指针T *last;//数组有效长度的尾指针 public://定义无参构…...

C++学习概述

1.c 为啥需要头文件 如果您刚开始使用 C&#xff0c;您可能想知道为什么C需要 #include 头文件&#xff0c;以及为什么一个程序要拥有多个 .cpp 文件。 原因很简单&#xff1a; a) 减少编译时间 随着程序的增长&#xff0c;您的代码也会增长&#xff0c;如果所有内容都在一个…...

关系型数据库和非关系型数据库

关系型数据库和非关系型数据库 关系型数据库非关系型数据库 非关系型数据库和关系型数据库是两种不同类型的数据库管理系统&#xff0c;它们用于存储和管理数据&#xff0c;但在数据组织和处理方式上有一些重要的区别。 关系型数据库 1.结构化数据存储&#xff1a;关系型数据库…...

基于SSM的快餐店点餐服务系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…...

使用vcpkg配置CGAL+visual studio 2022

先安装vcpkg C:\dev> git clone https://github.com/microsoft/vcpkg C:\dev> cd vcpkg C:\dev\vcpkg> .\bootstrap-vcpkg.bat 运行后&#xff0c;先执行 C:\dev\vcpkg> .\vcpkg.exe install yasm-tool:x86-windows 这是因为gmp库中有个bug&#xff0c;只能这样…...

【Spring面试】三、Bean的配置、线程安全、自动装配

文章目录 Q1、什么是Spring Bean&#xff1f;和对象有什么区别Q2、配置Bean有哪几种方式&#xff1f;Q3、Spring支持的Bean有哪几种作用域&#xff1f;Q4、单例Bean的优势是什么&#xff1f;Q5、Spring的Bean是线程安全的吗&#xff1f;Q6、Spring如何处理线程并发问题&#xf…...

flink连接kafka报:org.apache.kafka.common.errors.TimeoutException

测试flink1.12.7 连接kafka&#xff1a; package org.test.flink;import org.apache.flink.api.common.serialization.SimpleStringSchema; import org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.environment.StreamExecutio…...

sql order by 排序 null值放最后,怎么写

在 SQL 中&#xff0c;可以使用 ORDER BY 子句对结果进行排序。如果要将 NULL 值放在最后&#xff0c;可以在排序列中使用 CASE 表达式来处理。 下面是一个示例查询&#xff0c;将 NULL 值放在最后进行排序&#xff1a; SELECT column1, column2 FROM your_table ORDER BY CAS…...

HDMI字符显示实验

FPGA教程学习 第十五章 HDMI字符显示实验 文章目录 FPGA教程学习前言实验原理程序设计像素点坐标模块字符叠加模块 实验结果知识点总结 前言 在HDMI输出彩条的基础上输出osd叠加信息。 实验原理 实验通过字符转换工具将字符转换为 16 进制 coe 文件存放到单端口的 ROM IP 核…...

Spring Cloud 框架搭建

Spring Cloud 框架搭建之一基础框架 创建父项目创建子项目 创建父项目 第一步&#xff1a;新建项目&#xff0c;填写基础信息 第二步&#xff1a;这里不需要其他组件直接点next即可。 第三步&#xff1a;pom文件添加下述代码&#xff0c;将父项目设置为pom文件形式打包&#…...

长沙网站设计精选柚v米科技/名风seo软件

Linux网卡设置为网桥模式 1. 添加网卡&#xff0c;并修改相关配置文件 1.1虚拟机添加网卡&#xff0c;并配置相关文件 如&#xff1a;eth2为新添加网卡 cd /etc/sysconfig/network-scripts cp ifcfg-eth1 ifcfg-eth2 vi ifcfg-eth2 TYPEEthernet BOOTPROTOnone DEFROUTEyes …...

做网站需要注册吗/站点

目录&#x1f332; 前言 &#x1f332;&#x1f33b; Vagrant 简介 &#x1f33b;❤️ 入门玩法&#xff1a;Vagrant 安装 ❤️⚡️ 初阶玩法&#xff1a;Vagrant 常用命令 ⚡️1️⃣ Vagrant 基础命令2️⃣ Vagrant Box 管理3️⃣ Vagrant 虚拟机系统命令4️⃣ Vagrant 插件管…...

郑州专业做网站的/企业培训课程名称

141&#xff1a;环形链表1一、题目描述给定一个链表&#xff0c;判断链表中是否有环。     如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。为了表示给定链表中的环&#xff0c;我们使用整数 pos 来表示链表尾连接到链表…...

wordpress 主题demo/西地那非片的正确服用方法

注解的好处&#xff1a;1.能够读懂别人写的代码&#xff0c;特别是框架相关的代码。2.本来可能需要很多配置文件&#xff0c;需要很多逻辑才能实现的内容&#xff0c;就可以使用一个或者多个注解来替代&#xff0c;这样就使得编程更加简洁&#xff0c;代码更加清晰。3.&#xf…...

柳州专业网站建设加盟/西安优化外

骨架屏 最近在项目不时有用到骨架屏的需求,所以抽时间对骨架屏的方案作了一下调研,骨架屏的实践已经有很多了,也有很多人对自己的方案作了介绍.在这里按照个人的理解做了一个汇总和分类,分享给大家. 关于骨架屏(简介) 骨架屏就是在页面数据尚未加载前先给用户展示出页面的大…...

开发软件网站建设/网络推广工具有哪些

介绍编写一个应用程序并行运行很困难&#xff0c;对吧&#xff1f;我的意思是&#xff0c;它一定很难&#xff0c;否则我们会看到各处的并行程序。我们所看到的都是平滑的并行应用程序&#xff0c;可以毫不费力地使用每个可用的核心。相反&#xff0c;多线程应用程序是例外而不…...