数组与链表算法-单向链表算法
目录
数组与链表算法-单向链表算法
C++代码
单向链表插入节点的算法
C++代码
单向链表删除节点的算法
C++代码
对单向链表进行反转的算法
C++代码
单向链表串接的算法
C++代码
数组与链表算法-单向链表算法
在C++中,若以动态分配产生链表节点的方式,则可以先行定义一个类数据类型,接着在类中定义一个指针变量,其数据类型与此类相同,作用是指向下一个链表节点,另外类中至少要有一个数据字段。例如,声明一个学生成绩链表节点的结构,并且包含两个数据字段:姓名(name)和成绩(score),以及一个指针(next)。接着就可以动态创建链表中的每个节点。假设现在要新增一个节点至链表的末尾,且ptr指向链表的第一个节点,程序必须设计以下4个步骤:
- 动态分配内存空间给新节点使用。
- 将原链表尾部的指针(next)指向新元素所在的内存位置(内存地址)。
- 将ptr指针指向新节点的内存位置,表示这是新的链表尾部。
- 由于新节点当前为链表的最后一个元素,因此将它的指针(next)指向NULL。
遍历(Traverse)单向链表的过程,就是使用指针运算来访问链表中的每个节点。如果要遍历已建立的单向链表,就可以使用结构指针ptr来作为链表的读取游标,一开始指向链表的头。每次读完链表的一个节点,就将ptr往下一个节点移动(指向下一个节点),直到ptr指向NULL为止。
C++代码
#include<iostream>
using namespace std;class list {
public:int num;char name[10];int score;class list* next;
};void SetList(list* tempList) {cout << "请输入学号:";cin >> tempList->num;cout << "请输入姓名:";cin >> tempList->name;cout << "请输入成绩:";cin >> tempList->score;
}int main() {list* newnode;list* ptr;list* delptr;cout << "请输入5位学员的数据:" << endl;delptr = new list;SetList(delptr);ptr = delptr;for (int i = 1; i < 5; i++) {newnode = new list;SetList(newnode);newnode->next = nullptr;ptr->next = newnode;ptr = ptr->next;}cout << "学生成绩" << endl;cout << "学号\t姓名\t成绩\n========================" << endl;ptr = delptr;while (ptr != nullptr) {cout << ptr->num << "\t" << ptr->name << "\t" << ptr->score << endl;ptr = ptr->next;}return 0;
}
输出结果

单向链表插入节点的算法
- 将新节点加到第一个节点之前,即成为此链表的首节点。
- 将新节点加到最后一个节点之后。
- 将新节点加到链表中间的位置。
C++代码
#include<iostream>
using namespace std;class list {
public:int num;char name[10];int score;class list* next;
};void SetList(list* tempList) {cout << "请输入学号:";cin >> tempList->num;cout << "请输入姓名:";cin >> tempList->name;cout << "请输入成绩:";cin >> tempList->score;
}void PrintList(list* head) {list* ptr = head;while (ptr != nullptr) {cout << ptr->num << "\t" << ptr->name << "\t" << ptr->score << endl;ptr = ptr->next;}
}list* FindNode(list* head, int num) {list* ptr;ptr = head;while (ptr != nullptr) {if (ptr->num == num)return ptr;ptr = ptr->next;}return ptr;
}list* InsertNode(list* head, list* ptr, list* tempList) {if (ptr == nullptr) {tempList->next = head;return tempList;}else {if (ptr->next == nullptr) {ptr->next = tempList;}else {tempList->next = ptr->next;ptr->next = tempList;}}return head;
}int main() {list* newnode;list* ptr;list* head;cout << "请输入3位学员的数据:" << endl;head = new list;SetList(head);ptr = head;for (int i = 1; i < 3; i++) {newnode = new list;SetList(newnode);newnode->next = nullptr;ptr->next = newnode;ptr = ptr->next;}cout << "========================" << endl;cout << "学生成绩" << endl;cout << "学号\t姓名\t成绩\n========================" << endl;PrintList(head);int position;while (true){cout << "请输入要插入其后的学生学号,要结束请输入-1:";cin >> position;if (position == -1)break;else {ptr = FindNode(head, position);newnode = new list;SetList(newnode);head = InsertNode(head, ptr, newnode);}}cout << "========================" << endl;cout << "学生成绩" << endl;cout << "学号\t姓名\t成绩\n========================" << endl;PrintList(head);return 0;
}
输出结果

单向链表删除节点的算法
- 删除链表的第一个节点
- 删除链表的最后一个节点
- 删除链表的中间节点
C++代码
#include<iostream>
using namespace std;class list {
public:int num;char name[10];int score;class list* next;
};void SetList(list* tempList) {cout << "请输入学号:";cin >> tempList->num;cout << "请输入姓名:";cin >> tempList->name;cout << "请输入成绩:";cin >> tempList->score;
}void PrintList(list* head) {list* ptr = head;while (ptr != nullptr) {cout << ptr->num << "\t" << ptr->name << "\t" << ptr->score << endl;ptr = ptr->next;}
}list* FindNode(list* head, int num) {list* ptr;ptr = head;while (ptr != nullptr) {if (ptr->num == num)return ptr;ptr = ptr->next;}return ptr;
}list* DeleteNode(list* head, list* ptr) {list* top;top = head;if (ptr == head) {head = head->next;}else {while (top->next != ptr)top = top->next;if (ptr->next == nullptr)top->next = nullptr;elsetop->next = ptr->next;}cout << "已删除第 " << ptr->num << " 号学生的信息" << endl;delete ptr;return head;
}int main() {list* newnode;list* ptr;list* head;cout << "请输入3位学员的数据:" << endl;head = new list;SetList(head);ptr = head;for (int i = 1; i < 3; i++) {newnode = new list;SetList(newnode);newnode->next = nullptr;ptr->next = newnode;ptr = ptr->next;}cout << "========================" << endl;cout << "学生成绩" << endl;cout << "学号\t姓名\t成绩\n========================" << endl;PrintList(head);int position;while (true) {cout << "请输入要插入其后的学生学号,要结束请输入-1:";cin >> position;if (position == -1)break;else {ptr = FindNode(head, position);head = DeleteNode(head, ptr);}}cout << "========================" << endl;cout << "学生成绩" << endl;cout << "学号\t姓名\t成绩\n========================" << endl;PrintList(head);return 0;
}
输出结果

对单向链表进行反转的算法
了解单向链表节点的插入和删除之后,大家会发现在这种具有方向性的链表结构中增删节点是相当容易的一件事。而要从头到尾输出整个单向链表也不难,但若要反转过来输出单向链表,则需要某些技巧。我们知道单向链表中的节点特性是知道下一个节点的位置,是无从得知它的上一个节点的位置。如果要将单向链表反转,就必须使用3个指针变量,如下面程序代码中的before、ptr、last。
C++代码
#include<iostream>
using namespace std;class list {
public:int num;char name[10];int score;class list* next;
};void SetList(list* tempList) {cout << "请输入学号:";cin >> tempList->num;cout << "请输入姓名:";cin >> tempList->name;cout << "请输入成绩:";cin >> tempList->score;
}void PrintList(list* head) {list* ptr = head;while (ptr != nullptr) {cout << ptr->num << "\t" << ptr->name << "\t" << ptr->score << endl;ptr = ptr->next;}
}list* TransposeNode(list* head) {list* ptr = head;list* before = nullptr;list* last = nullptr;while (ptr != nullptr) {last = before; before = ptr;ptr = ptr->next;before->next = last;}head = before;return head;
}int main() {list* newnode;list* ptr;list* head;cout << "请输入3位学员的数据:" << endl;head = new list;SetList(head);ptr = head;for (int i = 1; i < 3; i++) {newnode = new list;SetList(newnode);newnode->next = nullptr;ptr->next = newnode;ptr = ptr->next;}cout << "========================" << endl;cout << "学生成绩" << endl;cout << "学号\t姓名\t成绩\n========================" << endl;PrintList(head);head = TransposeNode(head);cout << "========================" << endl;cout << "反转算法" << endl;cout << "学号\t姓名\t成绩\n========================" << endl;PrintList(head);return 0;
}
输出结果

单向链表串接的算法
对于两个或两个以上的链表的串接(Concatenation,也称为级联),实现起来很容易;只要将链表的首尾相连即可。
C++代码
#include<iostream>
using namespace std;class list {
public:int num;char name[10];int score;class list* next;
};void SetList(list* tempList) {cout << "请输入学号:";cin >> tempList->num;cout << "请输入姓名:";cin >> tempList->name;cout << "请输入成绩:";cin >> tempList->score;
}void PrintList(list* head) {list* ptr = head;while (ptr != nullptr) {cout << ptr->num << "\t" << ptr->name << "\t" << ptr->score << endl;ptr = ptr->next;}
}list* ConcatNode(list* head1, list* head2) {list* ptr;ptr = head1;while (ptr->next != nullptr)ptr = ptr->next;ptr->next = head2;return head1;
}int main() {list* newnode;list* ptr;list* head1;list* head2;cout << "请输入第一组3位学员的数据:" << endl;head1 = new list;SetList(head1);ptr = head1;for (int i = 1; i < 3; i++) {newnode = new list;SetList(newnode);newnode->next = nullptr;ptr->next = newnode;ptr = ptr->next;}cout << "========================" << endl;cout << "第一组学生成绩" << endl;cout << "学号\t姓名\t成绩\n========================" << endl;PrintList(head1);cout << "请输入第二组3位学员的数据:" << endl;head2 = new list;SetList(head2);ptr = head2;for (int i = 1; i < 3; i++) {newnode = new list;SetList(newnode);newnode->next = nullptr;ptr->next = newnode;ptr = ptr->next;}cout << "========================" << endl;cout << "第二组学生成绩" << endl;cout << "学号\t姓名\t成绩\n========================" << endl;PrintList(head2);head1 = ConcatNode(head1, head2);cout << "========================" << endl;cout << "串接算法" << endl;cout << "学号\t姓名\t成绩\n========================" << endl;PrintList(head1);return 0;
}
输出结果

相关文章:
数组与链表算法-单向链表算法
目录 数组与链表算法-单向链表算法 C代码 单向链表插入节点的算法 C代码 单向链表删除节点的算法 C代码 对单向链表进行反转的算法 C代码 单向链表串接的算法 C代码 数组与链表算法-单向链表算法 在C中,若以动态分配产生链表节点的方式,则可以…...
Oracle(6) Control File
一、oracle控制文件介绍 1、ORACLE控制文件概念 Oracle控制文件是Oracle数据库的一个重要元素,用于记录数据库的结构信息和元数据。控制文件包含了数据库的物理结构信息、数据字典信息、表空间和数据文件的信息等。在Oracle数据库启动时,控制文件会被读…...
吴恩达《机器学习》2-5->2-7:梯度下降算法与理解
一、梯度下降算法 梯度下降算法的目标是通过反复迭代来更新模型参数,以便最小化代价函数。代价函数通常用于衡量模型的性能,我们希望找到使代价函数最小的参数值。这个过程通常分为以下几个步骤: 初始化参数: 随机或设定初始参数…...
Pytorch detach()方法
detach() 是 PyTorch 中的一个方法,用于从计算图中分离(detach)张量。它可以将一个张量从当前计算图中分离出来,返回一个新的张量,该张量与原始张量共享相同的底层数据,但不再追踪梯度信息。 当你需要在计…...
CTF-php特性绕过
注意:null0 正确 nullflase 错误 Extract变量覆盖 <?php$flagxxx; extract($_GET);if(isset($shiyan)){ $contenttrim(file_get_contents($flag));//trim移除引号if($shiyan$content){ echoctf{xxx}; }else{ echoOh.no;} }?> extract() 函数从数组中将…...
人脸识别测试数据分析
一个人脸识别研究小组对若干名学生做了人脸识别的测试,将测试结果写入到一个文件 dir_50.txt 中,每一行是一张照片的识别结果“_照片编号”“.jpg”的字符串组合,示例如下: [1709020621, 0]_116.jpg [1709020621]_115.jpg [17706…...
MySQL 5.7限制general_log日志大小
背景 需求: 在MySQL 5.7.41中开启general_log 并限制其大小,避免快速增长占用硬盘空间。 解决: 通过定时任务,执行简单的脚本,判断general_log 日志的大小,实现对通用查询日志的“每日备份”或“每日清…...
tomcat9~10猫闪退个人经验
java版本17与8 8版本有jre,java17没有jre 所以在java8版本中将jre和jdk路径一同添加环境是不会出现闪退的,tomcat9没有闪退 但是在10就闪退了,因为java版本太低 java17没有jre,但是可以通过一种方法添加jre到java17的目录 完…...
Linux之J2EE的项目部署及发布
目录 前言 一、会议OA单体项目windows系统部署 1.检验工作 1. 检验jar项目包是否可以运行 2. 验证数据库脚本是否有误 3. 测试项目功能 2. 部署工作 2.1 传输文件 2.2 解压项目及将项目配置到服务器中 2.3 配置数据库 2.4 在服务器bin文件下点击startup.bat启动项目 …...
基于闪电搜索算法的无人机航迹规划-附代码
基于闪电搜索算法的无人机航迹规划 文章目录 基于闪电搜索算法的无人机航迹规划1.闪电搜索搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用闪电搜索算法来优化无人机航迹规划。 …...
【网络安全 --- 文件上传靶场练习】文件上传靶场安装以及1-5关闯关思路及技巧,源码分析
一,前期准备环境和工具 1,vmware 16.0安装 若已安装,请忽略 【网络安全 --- 工具安装】VMware 16.0 详细安装过程(提供资源)-CSDN博客文章浏览阅读186次,点赞9次,收藏2次。【网络安全 --- 工…...
BUUCTF刷题记录
[BJDCTF2020]Easy MD51 进入题目页面,题目提示有一个链接,应该是题目源码 进入环境,是一个查询框,无论输入什么都没有回显,查看源码也没什么用 利用bp抓包查看有没有什么有用的东西 发现响应的Hint那里有一个sql语句&…...
黑客技术(网络安全)—小白自学
目录 一、自学网络安全学习的误区和陷阱 二、学习网络安全的一些前期准备 三、网络安全学习路线 四、学习资料的推荐 想自学网络安全(黑客技术)首先你得了解什么是网络安全!什么是黑客! 网络安全可以基于攻击和防御视角来分类&am…...
免登陆 同步脚本 zookeeper kafka集群详细安装步骤
一.免登陆配置 #修改注解名 vim /etc/hostname #修改host文件 vim /etc/hosts 192.168.1.10 kafka1 kafka1 192.168.1.11 kafka2 kafka2 192.168.1.12 kafka3 kafka3#免登陆生成秘钥和授权自动登陆 ssh-keygen -t rsa cd ~/.ssh shh-copy-id kafka1 shh-copy-id kafka2 shh-co…...
深入理解NLP
引子 自然语言处理(Natural Language Processing, NLP)是人工智能领域中的一个重要研究方向,它涉及了计算机与人类自然语言之间的交互和理解。 1. NLP的起源与发展 NLP的起源可以追溯到早期的机器翻译项目,随着科技的进步&…...
Python-自动化绘制股票价格通道线
常规方案 通过将高点/低点与其 2 个或 3 个相邻点进行比较来检测枢轴点,并检查它是否是其中的最高/最低点。对所有枢轴点进行线性回归以获得上方和下方趋势线。价格离开通道后建仓。通过这样做,我们得到如下所示的价格通道。我认为我们可以利用给定的数据取得更好的结果。...
CTF-Crypto学习记录-第四天 “ “ --- SHA1安全散列算法,实现原理。
文章目录 前言SHA-1加密算法介绍关于SHA-1和MD5 SHA-1 加密过程原文处理设置初始值和数据结构定义加密运算原理过程 在python中调用SHA-1 前言 MD5学习MD5加密算法 SHA-1加密算法介绍 SHA-1(Secure Hash Algorithm1,安全散列算法1)是一种密…...
海南海口大型钢结构件3D扫描全尺寸三维测量平面度平行度检测-CASAIM中科广电
高精度三维扫描技术已经在大型工件制造领域发挥着重要作用,特别是在质量检测环节,高效、高精度,可以轻松实现全尺寸三维测量。本期,CASAIM要分享的应用是在大型钢结构件的关键部位尺寸及形位公差检测。 钢结构件,是将…...
【PyQt学习篇 · ④】:QWidget - 尺寸操作
文章目录 QWidget简介QWidget大小位置操作案例一案例二 QWidget尺寸限定操作案例 内容边距案例 QWidget简介 在PyQt中,QWidget是一个基本的用户界面类,用于创建可见的窗口组件。QWidget可以包含多种类型的子组件,如QPushButton、QLabel、QLi…...
APC学习记录
文章目录 APC概念APC插入、执行过程逆向分析插入过程执行过程总结 代码演示参考资料 APC概念 APC全称叫做异步过程调用,英文名是 Asynchronous Procedure Call,在进行系统调用、线程切换、中断、异常时会进行触发执行的一段代码,其中主要分为…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
