数据结构——链表——模板类实现双向链表——先完成再完美——持续更

news2024/11/17 13:26:06

链表:概念,实现,《数据结构》这里实现是基于模板的

C++语言基础,指针,引用。模板。《C++Primer》有些进阶用法放在语言学习的目录

LeetCode应用,会更新在LeetCode150,目前这个系列先暂停,数据结构更新一期,再更对应的题目解题。

新手村入门,可以根据下面实现的过程中,忘记的知识点,再回头看。

新手村入门

链表概念

列表:逻辑上有序,物理上无序(动态存储策略)【与向量一样,列表也是由具有线性逻辑次序的一组元素的集合。链表结构一般化推广】

好处:降低动态操作成本(插入,删除)O(1)

劣势:静态操作(查找,需要扫描一遍列表元素)O(n)

 L = \left \{ a_{0}, a_{1},..., a_{n-1} \right \}

元素称为节点;

模板函数的创建与模板类的创建

C++中的模板是一种允许我们为类或者函数定义一种通用模式的机制,这种通用模式可以用于创建多种数据类型的类或函数实例,而无需为每个类型都编写单独的代码。模板有两种主要类型:函数模板和类模板。

函数模板入门

函数模板允许我们定义一个通用的函数,该函数可以接受多种数据类型的参数。模板参数列表在函数定义之前用尖括号<>括起来,并紧跟在template关键字之后。

下面是一个简单的函数模板示例,它用于交换两个值的位置:

template <typename T> // 模板参数列表,typename T 是一个类型模板参数  
void swap(T& a, T& b) {  
    T temp = a;  
    a = b;  
    b = temp;  
}

在这个例子中,T是一个类型模板参数,它在编译时会被实际类型(如intdoublestd::string等)替换。

类模板

类模板允许我们定义一个通用的类,该类可以用于多种数据类型。与函数模板类似,类模板的模板参数列表也位于类声明之前,并紧跟在template关键字之后。

下面是一个简单的类模板示例,它用于创建一个动态数组:

template <typename T> // 模板参数列表  
class Array {  
private:  
    T* data;  
    size_t size;  
  
public:  
    Array(size_t s) : size(s), data(new T[s]) {}  
    ~Array() { delete[] data; }  
  
    T& operator[](size_t index) {  
        return data[index];  
    }  
  
    // 其他成员函数...  
};

在这个例子中,T是一个类型模板参数,它决定了数组data中元素的类型。

模板参数列表

模板参数列表可以包含多个类型模板参数,也可以包含非类型模板参数(如整数常量或指针)。类型模板参数用typenameclass关键字声明(两者在模板参数声明中是等价的),而非类型模板参数可以是整数、指针或其他非类型值。

下面是一个包含多个类型模板参数的类模板示例:

template <typename Key, typename Value> // 包含两个类型模板参数  
class Map {  
    // ... 类的实现,可能包含以Key和Value为类型的成员 ...  
};

下面是一个包含非类型模板参数的函数模板示例:

template <typename T, size_t N> // 包含一个类型模板参数和一个非类型模板参数  
void printArray(const T (&array)[N]) {  
    for (size_t i = 0; i < N; ++i) {  
        std::cout << array[i] << ' ';  
    }  
    std::cout << std::endl;  
}

在这个例子中,T是一个类型模板参数,而N是一个非类型模板参数(一个size_t类型的常量)。

OOP封装

在面向对象编程(OOP)中,封装(Encapsulation)是一个核心概念,它指的是将对象的属性和方法(或称为成员变量和成员函数)隐藏在对象内部,只通过公共接口(通常是公有方法)与外部世界进行交互。封装有助于隐藏对象的内部细节,防止外部代码直接访问或修改对象的内部状态,从而确保对象的完整性和安全性。

未封装处理通常指的是在编程中没有使用封装的概念,对象的属性和方法都是公开的,可以直接被外部代码访问和修改。这种编程方式可能会导致代码的可读性、可维护性和安全性降低。

下面是一个简单的例子来说明封装处理和未封装处理的区别:

未封装处理(不推荐)
class Person {  
public:  
    int age; // 年龄是公开的  
  
    // 没有提供任何方法来修改年龄  
};  
  
int main() {  
    Person p;  
    p.age = -5; // 外部代码可以直接修改年龄,甚至设置为一个不合理的值  
    return 0;  
}

在这个例子中,Person 类的 age 属性是公开的,任何外部代码都可以直接访问和修改它。这可能导致问题,因为年龄不应该是一个负数。

封装处理(推荐)
class Person {  
private: // 使用私有访问修饰符来隐藏属性  
    int age;  
  
public:  
    // 提供公有方法来设置年龄  
    void setAge(int newAge) {  
        if (newAge >= 0) { // 添加一个检查来确保年龄是非负的  
            age = newAge;  
        } else {  
            std::cerr << "Age cannot be negative!" << std::endl;  
        }  
    }  
  
    // 提供公有方法来获取年龄  
    int getAge() const {  
        return age;  
    }  
};  
  
int main() {  
    Person p;  
    p.setAge(-5); // 尝试设置一个不合理的年龄  
    // 输出:Age cannot be negative!  
    // 由于设置了检查,年龄没有被修改为-5  
    std::cout << "Person's age: " << p.getAge() << std::endl; // 输出:Person's age: 0(或之前的值,如果之前有设置过)  
    return 0;  
}

在这个封装处理的例子中,Person 类的 age 属性是私有的,外部代码不能直接访问或修改它。相反,我们提供了两个公有方法 setAgegetAge 来分别设置和获取年龄。在 setAge 方法中,我们添加了一个检查来确保年龄是非负的。这样,即使外部代码尝试设置一个不合理的年龄,它也会被拒绝,从而确保了对象的完整性和安全性。

函数模板进阶用法和注意(另一篇总结中)

指针和引用的区别 (另一篇总结中)

《数据结构(C++语言版)》不懂的专业术语

秩,线性代数的一个概念,极大线性无关。。。还在上大学的别学我,我的线代还给老师了。

专业解释,百度或者书本,在下面的链表中,简单理解为表示一个位置,像数组下标,秩相同(下标相同)。

ADT 抽象数据类型,一般指数据的某种抽象和操作

API 应用程序结构,软件之间的交互

我们下面的目标是,根据书中提供的 ADT,代码模板,写出一个可以运行的模板链表类,Let's Go!

链表之旅

第一个任务,列表节点 

注意:默认链表中每个节点都有数据,并且未对数据进行封装处理。

第二个任务,列表的实现

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

遇见问题-VMware虚拟机打开运行一段时间后卡死

1.问题原因 因为Windows自带的虚拟化软件Hyper-V与VMware存在冲突。 2.关闭Hyper-V 1.打开【控制面板】-【程序和功能】-【启用或关闭Windows功能】3.关闭HV主机服务 1.右击计算机-》管理-》服务和应用名称-》服务-》找到HV主机服务-》右击属性停止服务 -》启动类型设置为禁…

NASA数据集——阿尔法喷气式大气实验二氧化碳和甲烷数据

Alpha Jet Atmospheric eXperiment Carbon Dioxide and Methane Data 阿尔法喷气式大气实验二氧化碳和甲烷数据 简介 Alpha Jet Atmospheric eXperiment (AJAX) 是美国国家航空航天局艾姆斯研究中心与 H211, L.L.C. 公司的合作项目&#xff0c;旨在促进对加利福尼亚、内华达…

asp.net core接入prometheus2-自定义指标

前提 了解一下asp.net core接入prometheus快速入门 https://blog.csdn.net/qq_36437991/article/details/139064138 新建.net 8空web项目 安装下面三个包 <PackageReference Include"OpenTelemetry.Exporter.Prometheus.AspNetCore" Version"1.8.0-rc.1&…

【软件设计师】计算机组成原理

1、数据的表示 1.1 进制转换 整型有4种进制形式&#xff1a; 1.十进制&#xff08;D&#xff09;&#xff1a; 都是以0-9这九个数字组成&#xff0c;不能以0开头。 2.二进制&#xff08;B&#xff09;&#xff1a; 由0和1两个数字组成。 3.八进制&#xff08;O&#xff09;&am…

Java的类路径究竟是什么?

回答 问了chatgpt这个问题&#xff0c;首先类路径的定义是&#xff1a; 是指一组路径&#xff0c;这些路径告诉Java虚拟机&#xff08;JVM&#xff09;和类加载器在哪里可以找到应用程序所需的类和资源文件。说白了就是在运行java程序的时候需要先将java源代码编译成class文件…

代码随想录——从前序与中序遍历序列构造二叉树(Leetcode105)

题目链接 递归 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

nginx + confd + etcd 实现nginx动态白名单,防止请求host篡改注入攻击

众所周知&#xff0c;浏览器发送到后台请求header中携带的host是可能被修改的&#xff0c;为了防止这件事情发生&#xff0c;就很有必要给后台设置host请求白名单了&#xff0c;本次将介绍nginx如何配置&#xff0c;以及结合confd和etcd实现动态配置。 1. http/https请求的host…

flink cdc mysql整理与总结

文章目录 一、业务中常见的需要数据同步的场景CDC是什么FlinkCDC是什么CDC原理为什么是FlinkCDC业务场景flink cdc对应flink的版本 二、模拟案例1.阿里云flink sql2.开源flink sql(单机模式)flink 安装安装mysql3.flink datastream 三、总结 提示&#xff1a;以下是本篇文章正文…

MFC扩展库BCGControlBar Pro v34.1新版亮点:日历和计划表等功能升级

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版 v34.1已正式发布了&#xff0c;这个版本包含了对Windows 10/11字体图标的支持、功能区和…

huggingface 笔记:查看GPU占用情况

0 准备部分 0.1 创建虚拟数据 import numpy as npfrom datasets import Datasetseq_len, dataset_size 512, 512 dummy_data {"input_ids": np.random.randint(100, 30000, (dataset_size, seq_len)),"labels": np.random.randint(0, 1, (dataset_size…

PHP+Lucky+Baby母婴用品网站的设计与实现75554-计算机毕业设计项目选题推荐(附源码)

摘 要 近年来&#xff0c;随着移动互联网的快速发展&#xff0c;电子商务越来越受到网民们的欢迎&#xff0c;电子商务对国家经济的发展也起着越来越重要的作用。简单的流程、便捷可靠的支付方式、快捷畅通的物流快递、安全的信息保护都使得电子商务越来越赢得网民们的青睐。现…

中国低调海外巨头,实力超乎想象!

在全球化的浪潮中&#xff0c;中国公司正以前所未有的速度和规模走向世界。他们或许低调&#xff0c;但却实力非凡&#xff0c;在国际市场上掀起了一股不可小觑的“中国风暴”。今天&#xff0c;就让我们揭开那些在国外牛逼到爆炸的中国公司的神秘面纱&#xff0c;深度解析他们…

IP编址、进制转换、IP地址分类、变长子网掩码VLSM、无类域间路由CIDR

前言 网络层位于数据链路层与传输层之间。网络层中包含了许多协议&#xff0c;其中最为重要的协议就是IP协议。网络层提供了IP路由功能。理解IP路由除了要熟悉IP协议的工作机制之外&#xff0c;还必须理解IP编址以及如何合理地使用IP地址来设计网络。 IP编址 每个网段上都有两…

滤波电路应用笔记

滤波器 什么是滤波器&#xff1f; 滤波器是一种使某些频率或频带上的电信号通过而阻止其他信号通过的装置。 滤波电路的作用是尽可能减少脉动直流电压中的交流分量&#xff0c;保持其直流分量&#xff0c;降低输出电压的纹波系数&#xff0c;并使波形相对平滑。整流电路的输出…

商标注册申请名称的概率,多想名称选通过率好的!

近日给深圳客户申请的商标初审下来了&#xff0c;两个类别都下的初审&#xff0c;和当初的判断基本一致&#xff0c;普推知产老杨当时沟通说需要做担保申请注册也可以&#xff0c;后面选择了管家注册&#xff0c;最近大量的帮客户检索商标名称&#xff0c;分享下经验。 两个字基…

PC端应用订阅SDK接入攻略

本文档介绍了联想应用联运sdk接入操作指南&#xff0c;您可在了解文档内容后&#xff0c;自行接入应用联运sdk。 1. 接入前准备 1. 请先与联想商务达成合作意向。 2. 联系联想运营&#xff0c;提供应用和公司信息&#xff0c;并获取商户id、app id、key&#xff08;公私钥、…

【设计模式深度剖析】【4】【结构型】【组合模式】| 以文件系统为例加深理解

&#x1f448;️上一篇:适配器模式 设计模式深度剖析-专栏&#x1f448;️ 目 录 组合模式定义英文原话直译如何理解&#xff1f; 3个角色UML类图代码示例 组合模式的优点组合模式的使用场景示例解析&#xff1a;文件系统 组合模式 组合模式&#xff08;Composite Pattern&a…

【经典论文阅读10】MNS采样——召回双塔模型的最佳拍档

这篇发表于2020 WWW 上的会议论文&#xff0c;提出一种MNS方式的负样本采样方法。众所周知&#xff0c;MF方法难以解决冷启动问题&#xff0c;于是进化出双塔模型&#xff0c;但是以双塔模型为基础的召回模型的好坏十分依赖负样本的选取。为了解决Batch内负样本带来的选择性偏差…

IT廉连看——UniApp——条件渲染

IT廉连看——UniApp——条件渲染 什么是条件渲染&#xff1f; 顾名思义&#xff0c;满足一定的条件他才会进行渲染。 这是我们上节事件绑定保留的代码。 一、现在我有这样一个需求&#xff1a; 增加一个按钮&#xff0c;当我点击这个按钮&#xff0c;这里的文本&#xff0…

ICML 2024 | 即插即用!无需训练!基于球面高斯约束引导的条件扩散模型

©PaperWeekly 原创 作者 | 杨凌霄 单位 | 上海科技大学信息学院 论文标题&#xff1a; Guidance with Spherical Gaussian Constraint for Conditional Diffusion 论文作者&#xff1a; 杨凌霄、丁枢桐、蔡逸凡、虞晶怡、汪婧雅、石野 通讯作者&#xff1a; 石野 论文链接…