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

数组与链表算法-单向链表算法

目录

数组与链表算法-单向链表算法

C++代码

单向链表插入节点的算法

C++代码

单向链表删除节点的算法

C++代码

对单向链表进行反转的算法

C++代码

单向链表串接的算法

C++代码


数组与链表算法-单向链表算法

在C++中,若以动态分配产生链表节点的方式,则可以先行定义一个类数据类型,接着在类中定义一个指针变量,其数据类型与此类相同,作用是指向下一个链表节点,另外类中至少要有一个数据字段。例如,声明一个学生成绩链表节点的结构,并且包含两个数据字段:姓名(name)和成绩(score),以及一个指针(next)。接着就可以动态创建链表中的每个节点。假设现在要新增一个节点至链表的末尾,且ptr指向链表的第一个节点,程序必须设计以下4个步骤:

  1. 动态分配内存空间给新节点使用。
  2. 将原链表尾部的指针(next)指向新元素所在的内存位置(内存地址)。
  3. 将ptr指针指向新节点的内存位置,表示这是新的链表尾部。
  4. 由于新节点当前为链表的最后一个元素,因此将它的指针(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;
}

输出结果

单向链表插入节点的算法

  1. 将新节点加到第一个节点之前,即成为此链表的首节点。
  2. 将新节点加到最后一个节点之后。
  3. 将新节点加到链表中间的位置。

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;
}

输出结果

单向链表删除节点的算法

  1. 删除链表的第一个节点
  2. 删除链表的最后一个节点
  3. 删除链表的中间节点

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中&#xff0c;若以动态分配产生链表节点的方式&#xff0c;则可以…...

Oracle(6) Control File

一、oracle控制文件介绍 1、ORACLE控制文件概念 Oracle控制文件是Oracle数据库的一个重要元素&#xff0c;用于记录数据库的结构信息和元数据。控制文件包含了数据库的物理结构信息、数据字典信息、表空间和数据文件的信息等。在Oracle数据库启动时&#xff0c;控制文件会被读…...

吴恩达《机器学习》2-5->2-7:梯度下降算法与理解

一、梯度下降算法 梯度下降算法的目标是通过反复迭代来更新模型参数&#xff0c;以便最小化代价函数。代价函数通常用于衡量模型的性能&#xff0c;我们希望找到使代价函数最小的参数值。这个过程通常分为以下几个步骤&#xff1a; 初始化参数&#xff1a; 随机或设定初始参数…...

Pytorch detach()方法

detach() 是 PyTorch 中的一个方法&#xff0c;用于从计算图中分离&#xff08;detach&#xff09;张量。它可以将一个张量从当前计算图中分离出来&#xff0c;返回一个新的张量&#xff0c;该张量与原始张量共享相同的底层数据&#xff0c;但不再追踪梯度信息。 当你需要在计…...

CTF-php特性绕过

注意&#xff1a;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() 函数从数组中将…...

人脸识别测试数据分析

一个人脸识别研究小组对若干名学生做了人脸识别的测试&#xff0c;将测试结果写入到一个文件 dir_50.txt 中&#xff0c;每一行是一张照片的识别结果“_照片编号”“.jpg”的字符串组合&#xff0c;示例如下&#xff1a; [1709020621, 0]_116.jpg [1709020621]_115.jpg [17706…...

MySQL 5.7限制general_log日志大小

背景 需求&#xff1a; 在MySQL 5.7.41中开启general_log 并限制其大小&#xff0c;避免快速增长占用硬盘空间。 解决&#xff1a; 通过定时任务&#xff0c;执行简单的脚本&#xff0c;判断general_log 日志的大小&#xff0c;实现对通用查询日志的“每日备份”或“每日清…...

tomcat9~10猫闪退个人经验

java版本17与8 8版本有jre&#xff0c;java17没有jre 所以在java8版本中将jre和jdk路径一同添加环境是不会出现闪退的&#xff0c;tomcat9没有闪退 但是在10就闪退了&#xff0c;因为java版本太低 java17没有jre&#xff0c;但是可以通过一种方法添加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代码 摘要&#xff1a;本文主要介绍利用闪电搜索算法来优化无人机航迹规划。 …...

【网络安全 --- 文件上传靶场练习】文件上传靶场安装以及1-5关闯关思路及技巧,源码分析

一&#xff0c;前期准备环境和工具 1&#xff0c;vmware 16.0安装 若已安装&#xff0c;请忽略 【网络安全 --- 工具安装】VMware 16.0 详细安装过程&#xff08;提供资源&#xff09;-CSDN博客文章浏览阅读186次&#xff0c;点赞9次&#xff0c;收藏2次。【网络安全 --- 工…...

BUUCTF刷题记录

[BJDCTF2020]Easy MD51 进入题目页面&#xff0c;题目提示有一个链接&#xff0c;应该是题目源码 进入环境&#xff0c;是一个查询框&#xff0c;无论输入什么都没有回显&#xff0c;查看源码也没什么用 利用bp抓包查看有没有什么有用的东西 发现响应的Hint那里有一个sql语句&…...

黑客技术(网络安全)—小白自学

目录 一、自学网络安全学习的误区和陷阱 二、学习网络安全的一些前期准备 三、网络安全学习路线 四、学习资料的推荐 想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客&#xff01; 网络安全可以基于攻击和防御视角来分类&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

引子 自然语言处理&#xff08;Natural Language Processing, NLP&#xff09;是人工智能领域中的一个重要研究方向&#xff0c;它涉及了计算机与人类自然语言之间的交互和理解。 1. NLP的起源与发展 NLP的起源可以追溯到早期的机器翻译项目&#xff0c;随着科技的进步&…...

Python-自动化绘制股票价格通道线

常规方案 通过将高点/低点与其 2 个或 3 个相邻点进行比较来检测枢轴点,并检查它是否是其中的最高/最低点。对所有枢轴点进行线性回归以获得上方和下方趋势线。价格离开通道后建仓。通过这样做,我们得到如下所示的价格通道。我认为我们可以利用给定的数据取得更好的结果。...

CTF-Crypto学习记录-第四天 “ “ --- SHA1安全散列算法,实现原理。

文章目录 前言SHA-1加密算法介绍关于SHA-1和MD5 SHA-1 加密过程原文处理设置初始值和数据结构定义加密运算原理过程 在python中调用SHA-1 前言 MD5学习MD5加密算法 SHA-1加密算法介绍 SHA-1&#xff08;Secure Hash Algorithm1&#xff0c;安全散列算法1&#xff09;是一种密…...

海南海口大型钢结构件3D扫描全尺寸三维测量平面度平行度检测-CASAIM中科广电

高精度三维扫描技术已经在大型工件制造领域发挥着重要作用&#xff0c;特别是在质量检测环节&#xff0c;高效、高精度&#xff0c;可以轻松实现全尺寸三维测量。本期&#xff0c;CASAIM要分享的应用是在大型钢结构件的关键部位尺寸及形位公差检测。 钢结构件&#xff0c;是将…...

【PyQt学习篇 · ④】:QWidget - 尺寸操作

文章目录 QWidget简介QWidget大小位置操作案例一案例二 QWidget尺寸限定操作案例 内容边距案例 QWidget简介 在PyQt中&#xff0c;QWidget是一个基本的用户界面类&#xff0c;用于创建可见的窗口组件。QWidget可以包含多种类型的子组件&#xff0c;如QPushButton、QLabel、QLi…...

APC学习记录

文章目录 APC概念APC插入、执行过程逆向分析插入过程执行过程总结 代码演示参考资料 APC概念 APC全称叫做异步过程调用&#xff0c;英文名是 Asynchronous Procedure Call&#xff0c;在进行系统调用、线程切换、中断、异常时会进行触发执行的一段代码&#xff0c;其中主要分为…...

如何高效使用FFmpegGUI:面向新手的完整视频处理工具指南

如何高效使用FFmpegGUI&#xff1a;面向新手的完整视频处理工具指南 【免费下载链接】ffmpegGUI ffmpeg GUI 项目地址: https://gitcode.com/gh_mirrors/ff/ffmpegGUI FFmpegGUI是一款让零基础用户也能轻松掌握专业视频处理的跨平台图形界面工具。这款基于Electron和Rea…...

重生之我用 AI 复活了我的同事

阅读本文大概需要 2.8 分钟。在写这篇文章之前先解答上篇文章评论区反映的两个问题&#xff1a;第一个问题&#xff0c;有人读完文章说&#xff0c;张哥&#xff0c;那以后是用 AI 还是不用呢&#xff1f;当然要用了&#xff0c;而且是鼓励大家全面使用。我文章本意是 AI 发展之…...

别急着重烧系统!卡在Starting Kernel时,先检查uboot的mmc分区表(以imx6ull为例)

嵌入式系统启动卡在Starting Kernel&#xff1f;先别急着重烧系统&#xff01; 当你满怀期待地按下开发板电源键&#xff0c;串口终端却无情地定格在"Starting kernel..."这一行时&#xff0c;那种挫败感每个嵌入式开发者都深有体会。大多数人的第一反应是怀疑内核镜…...

javaweb企业设备信息资讯展示网站

目录同行可拿货,招校园代理 ,本人源头供货商功能模块划分核心业务功能技术实现要点安全与维护项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作同行可拿货,招校园代理 ,本人源头供货商 功能模块划分 用户管理模块 用户注册与登…...

Graphormer高性能部署:PyTorch 2.8.0 + Torch-Geometric 2.4优化实践

Graphormer高性能部署&#xff1a;PyTorch 2.8.0 Torch-Geometric 2.4优化实践 1. 引言 Graphormer是一种基于纯Transformer架构的图神经网络&#xff0c;专为分子属性预测任务设计。与传统的图神经网络(GNN)相比&#xff0c;Graphormer通过全局注意力机制直接建模分子图中原…...

告别环境配置噩梦:手把手教你用OpenVINO 2024.4 + VS2019部署PyTorch图像分类模型(附完整代码)

从PyTorch到生产环境&#xff1a;OpenVINO 2024.4全链路部署实战指南 当你的PyTorch模型在实验环境中表现优异&#xff0c;如何将它无缝迁移到实际应用场景&#xff1f;本文将带你跨越从研究到生产的鸿沟&#xff0c;使用Intel OpenVINO工具包2024.4版本&#xff0c;在Visual S…...

OpenClaw飞书机器人进阶:Qwen3.5-9B图片问答自动回复

OpenClaw飞书机器人进阶&#xff1a;Qwen3.5-9B图片问答自动回复 1. 为什么选择OpenClaw飞书Qwen3.5-9B组合&#xff1f; 去年我们团队内部遇到一个典型问题&#xff1a;产品文档和功能说明分散在各个Confluence页面&#xff0c;新同事遇到界面不熟悉时&#xff0c;老员工需要…...

OpenClaw小龙虾初体验【安装学习】

文章目录一、前言二、安装三、360安全龙虾四、腾讯龙虾4.1 文件移动4.2 应用分析4.3 Docker失败原因一、前言 最近小龙虾很火&#xff0c;不禁能说还能做&#xff0c;本质就类似木马&#xff0c;获取电脑权限&#xff0c;不禁能操作各应用还能联动外接设备。 那肯定要学习一下…...

ChatGPT+RMBG-2.0:智能图像处理工作流自动化

ChatGPTRMBG-2.0&#xff1a;智能图像处理工作流自动化 1. 当你还在手动抠图时&#xff0c;有人已经用一句话完成整套流程 上周帮朋友处理一批电商产品图&#xff0c;他花了整整两天时间在Photoshop里一张张抠背景、调边缘、换底色。最后发来消息说&#xff1a;“要是能对着图…...

开源大模型部署案例:Pixel Language Portal镜像免配置快速上手教程

开源大模型部署案例&#xff1a;Pixel Language Portal镜像免配置快速上手教程 1. 产品概览 Pixel Language Portal&#xff08;像素语言跨维传送门&#xff09;是一款基于Tencent Hunyuan-MT-7B大模型构建的创新翻译工具。与传统翻译软件不同&#xff0c;它将语言转换过程设…...