21-22 - 线性表的链式存储结构 单链表的具体实现

---- 整理自狄泰软件唐佐林老师课程

文章目录

  • 1. 线性表的链式存储结构
    • 1.1 定义
    • 1.2 逻辑结构
    • 1.3 专业术语的统一
  • 2. 链表的基本概念
    • 2.1 单链表中的结点定义
    • 2.2 单链表中的内部结构
    • 2.3 在目标位置处插入数据元素
    • 2.4 在目标位置处删除数据元素
  • 3. 链式存储结构线性表的实现
    • 3.1 设计要点
    • 3.2 实现
    • 3.3 问题
    • 3.4 优化
  • 4. 小结

1. 线性表的链式存储结构

  • 顺序存储结构线性表的问题:插入和删除需要移动大量的元素

1.1 定义

为了表示每个数据元素与其直接后继元素之间的逻辑关系,数据元素除了存储自身的信息外,还需要存储其直接后继的信息。

在这里插入图片描述

1.2 逻辑结构

  • 基于链式存储结构的线性表中,每个结点都包含数据域和指针域
    • 数据域:存储数据元素本身
    • 指针域:存储相邻结点的地址

在这里插入图片描述

1.3 专业术语的统一

  • 顺序表:基于顺序存储结构的线性表
  • 链表:基于链式存储结构的线性表
    • 单链表:每个结点只包含直接后继的地址信息
    • 循环链表:单链表中的最后一个结点的直接后继为第一个结点
    • 双向链表:单链表中的结点包含前驱和后继的地址信息

2. 链表的基本概念

  • 头结点:链表中的辅助结点,包含指向第一个数据元素的指针
  • 数据结点:链表中代表数据元素的结点,表现形式为:(数据元素,地址)
  • 尾结点:链表中的最后一个数据结点,包含的地址信息为空

2.1 单链表中的结点定义

在这里插入图片描述

2.2 单链表中的内部结构

  • 头结点在单链表中的意义是:辅助数据元素的定位,方便插入和删除;因此,头结点不存储实际的数据元素。

在这里插入图片描述

2.3 在目标位置处插入数据元素

  1. 从头结点开始,通过 current 指针定位到目标位置
  2. 从堆空间申请新的 Node 结点
  3. 执行操作:
node->value = e;
node->next = current->next;
current->next = node;

2.4 在目标位置处删除数据元素

  1. 从头结点开始,通过 current 指针定位到目标位置
  2. 使用 toDel 指针指向需要删除的结点
  3. 执行操作:
toDel = current->next;
current->next = toDel->next;
delete toDel;

3. 链式存储结构线性表的实现

在这里插入图片描述

3.1 设计要点

  1. 类模板,通过头结点访问后继结点
  2. 定义内部结点类型 Node,用于描述数据域和指针域
  3. 实现线性表的关键操作(增、删、查,等)
template<typename T>
class LinkList : public List<T>
{
protected:
	struct Node : public Object {
		T value;
		Node* next;
	};
	
	Node m_header;
	int m_length;
public:
	LinkList();
	
	// ...
};

3.2 实现

【单链表的具体实现】

3.3 问题

  • 头结点是否存在隐患?代码如何优化?

在这里插入图片描述

#include <iostream>
#include "LinkList.h"

using namespace DTLib;
using namespace std;

class Test
{
public:
    Test()
    {
        throw 0;
    }
};

int main()
{
    LinkList<Test> list;

    cout << "test" << endl;

    return 0;
}

在这里插入图片描述

  • LinkList 成员 m_header,在构造 LinkList 对象的时候,会构造 Node 对象,进一步构造 T 对象,和用户定义的对象类型有关。

3.4 优化

【单链表优化】

4. 小结

  • 通过类模板实现链表,包含头结点成员和长度成员
  • 定义结点类型,并通过堆中的结点对象构成链式存储
  • 为了避免构造错误的隐患,头结点类型需要重定义

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/571848.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

排列对称串

Description:很多字串&#xff0c;有些是对称的&#xff0c;有些是不对称的&#xff0c;请将那些对称的字事按从小到大的顺序输出&#xff0c;字事先以长度论大小&#xff0c;如果长度相同&#xff0c;再以ASCI码值为大小标准 Input.输入数据中含有一些字串(1≤串长≤256)。 #…

linux文件句柄数满,linux文件句柄数超出系统限制怎么办?

1、问题阐述&#xff1a; too many open files&#xff1a;顾名思义即打开过多文件数。 不过这里的files不单是文件的意思&#xff0c;也包括打开的通讯链接(比如socket)&#xff0c;正在监听的端口等等&#xff0c;所以有时候也可以叫做句柄(handle)&#xff0c;这个错误通常…

Rust腐蚀服务器搭建架设教程ubuntu系统

Rust腐蚀服务器搭建架设教程ubuntu系统 大家好我是艾西一个做服务器租用的网络架构师。Rust腐蚀游戏对于服务器的配置有一定的要求很多小伙伴就思考用linux系统搭建的话占用会不会小一点&#xff0c;有一定电脑基础的小伙伴都知道Linux系统和windows系统相比较linux因为是面板…

coreldraw2024精简版绿色版安装包免费下载

CorelDRAW 2024是一款矢量图形设计软件&#xff0c;于2024年3月5日正式在全球范围内发布。这款软件在多个方面进行了更新和改进&#xff0c;为用户提供了更多高效、灵活和便捷的设计工具。 首先&#xff0c;CorelDRAW 2024新增了绘画笔刷功能&#xff0c;这些笔刷不仅模拟了传…

算法学习001-圆桌问题 中小学算法思维学习 信奥算法解析 c++实现

目录 算法学习001-圆桌问题 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、推荐资料 算法学习001-圆桌问题 一、题目要求 1、编程实现 圆桌边围坐着2n个人&#xff0c;其中n个人是好人&#xff0c…

【199.二叉树的右视图】_二叉树_day01

1 题目描述 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。199.二叉树的右视图 2 解题思路 此题是二叉树层序遍历的拓展。 创建一个队列que (Queue)起到中介的作用&#xff0c…

Atom-7B-Chat本地推理

Atom-7B-Chat 本地推理 基础环境信息&#xff08;wsl2安装Ubuntu22.04 miniconda&#xff09; 使用miniconda搭建环境 (base) :~$ conda create --name Llama-Chinese python3.10 Retrieving notices: ...working... done Channels:- defaults Platform: linux-64 Collectin…

RealSenseSR300工程环境配置说明

新建目录结构如下&#xff1a; output:存储可执行文件.exe等src:存储源码.cpp .h等3rdparty:存储第三方库 opencv等 其中将源码按照main及其相关文件分为以下三类 vs2015许可证到期后先激活&#xff0c;激活码很多网上有&#xff0c;如&#xff1a;HMGNV-WCYXV-X7G9W-YCX63…

企业微信hook接口协议,根据手机号搜索联系人

根据手机号搜索联系人 参数名必选类型说明uuid是String每个实例的唯一标识&#xff0c;根据uuid操作具体企业微信 请求示例 {"uuid":"3240fde0-45e2-48c0-90e8-cb098d0ebe43","phoneNumber":"1357xxxx" } 返回示例 {"data&q…

【SQL代理中转注入】对DVWA登录界面username字段实施注入

一、实验过程 步骤0&#xff1a;注释掉相关username防护&#xff0c;截图如下&#xff1a; 以DVWA为攻击目标&#xff0c;将login.php中第21、22行注释掉 步骤1&#xff1a;源码分析&#xff0c;截图如下&#xff1a; 如此可知&#xff0c;首先需要通过token验证&#xff0c;然…

Matlab|含多微网租赁共享储能的配电网博弈优化调度

目录 主要内容 结果一览 下载链接 主要内容 首先利用NSGA-II算法求解三个微网的最优充放电策略并做为已知条件代入到双层调度模型中&#xff1b;然后求解双层模型&#xff0c;上层为主动配电网调度模型&#xff0c;下层包括共享储能优化模型和多微网优化调度模型&a…

【Camera KMD ISP SubSystem笔记】CAM SYNC与DRQ①

在android系统中fence用于不同模块需要访问同一块buffer的同步&#xff0c;例如camera和graphic。对于preview buffer, camera是生产者graphic是消费者。 camera需要生产图像数据到preview buffer时需要等待preview buffer的 fence可用。 camera sync是高通camx框架里面用于各个…

SpringBoot学习之Redis下载安装启动【Windows版本】(三十六)

一、下载Redis for Windows Redis 官方网站没有提供 Windows 版的安装包,但可以通过 GitHub 来下载安装包,下载地址:https://github.com/tporadowski/redis/releases 1、网站提供了安装包和免安装版本,这里我们直接选择下面的免安装版本 2、下载后的压缩包解压以后,如下…

idm序列号永久激活码2023免费可用 IDM软件破解版下载 最新版Internet Download Manager 网络下载加速必备神器 IDM设置中文

IDM是一款多线程下载工具&#xff0c;全称Internet Download Manager。IDM的多线程加速功能&#xff0c;能够充分利用宽带&#xff0c;所以下载速度会比较快&#xff0c;而且它支持断点续传。它的网站音视频捕获、站点抓取、静默下载等功能&#xff0c;也特别实用。 idm使用技…

MyBatisPlus分页查询的使用

一、导入依赖 <!-- MyBatis-plus的依赖 --> <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.4</version> </dependency><!-- mysql的依赖 --> &l…

C# Solidworks二次开发:枚举应用实战(第三讲)

大家好&#xff0c;今天继续介绍枚举相关内容。 下面是今天要介绍的枚举&#xff1a; &#xff08;1&#xff09;第一个为swACisOutputVersion&#xff0c;这个枚举为ACIS的版本&#xff0c;下面是官方的具体解释&#xff1a; 其枚举值为&#xff1a; MemberDescriptionswAc…

JVM支持的可配置参数查看和分类

JVM参数大致可以分为三类: 标注指令:-开头。 这些是所有的HotSpot都支持的参数。可以用java-help 打印出来。 非标准指令: -X开头。 这些指令通常是跟特定的HotSpot版本对应的。可以用java -X打印出来。 不稳定参数: -XX 开头。 这一类参数是跟特定HotSpot版本对应的&#x…

【简单介绍下机器学习之sklearn基础】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

【注解和反射】获取类运行时结构

继上一篇博客【注解和反射】类加载器-CSDN博客 目录 七、获取类运行时结构 测试 getFields()和getDeclaredFields() getMethods()和getDeclaredMethods() 七、获取类运行时结构 获取类运行时结构通常指的是在Java等面向对象编程语言中&#xff0c;使用反射&#xff08;Ref…

Linux 小技巧1

目录 一. 统计文件的总行数二. 获取从第二行开始的内容三. 合并两个文件为一个文件四. 统计指定列唯一值的数量五. 列出文件的绝对路径六. 获取除了空白行和注释之外的部分 一. 统计文件的总行数 ⏹非压缩文件 统计当前文件夹下csv文件的行数 wc -l ./*.csv统计指定文件夹下…