卡码网语言基础课 | 13. 链表的基础操作Ⅰ

news2024/11/24 0:28:55

目录

一、 回顾

二、 指针

2.1 声明指针

2.2 指针获取地址

2.3 解引用 

2.4 指针与数组的关系

2.5 指针的算术操作及访问

2.6 空指针值

三、 链表

3.1 概念

3.2 虚拟头节点

3.3 定义链表节点

3.4 结构体的成员变量

3.5 初始化结构体

3.6 完整结构体代码

四、 链表的插入

4.1 操作思路

4.2 new运算符和箭头语法->

五、 题解


题目:

构建一个单向链表,链表中包含一组整数数据。输出链表中的所有元素。

要求:
1. 使用自定义的链表数据结构
2. 提供一个 linkedList 类来管理链表,包含构建链表和输出链表元素的方法
3. 在 main 函数中,创建一个包含一组整数数据的链表,然后调用链表的输出方法将所有元素打印出来

一、 回顾

在之前的学习中,我们了解了字符串和数组这两种结构,它们具有着以下的共同点

  • 元素按照一定的顺序来排列
  • 可以通过索引来访问数组中的元素和字符串中的字符

但是它们也都有着一些缺点:

  • 固定大小:数组的大小通常是固定的,一旦分配了内存空间,就难以动态地扩展或缩小,如果需要存储的元素数量超出了数组的大小,就需要重新分配更大的数组,并将原来数组的内容复制过去,需要执行很多额外的操作。
  • 内存是连续的:正是因为元素按照一定的顺序来排列,它们在计算机内存中的存储也是连续的,这也就意味着,当需要存储一些需要占用空间较大的内容,也只能找一些大块的内存区域,而空间比较小的内存区域就被浪费了,从而导致了内存资源浪费。
  • 固定的数据类型数组要求所有元素具有相同的数据类型,字符串存储的都是字符,如果需要存储不同类型的数据,数组和字符串就不能满足以上需求了。

二、 指针

C++中的指针就像是一个地址的引用,它帮助访问和操作存储在计算机内存中的数据

2.1 声明指针

声明指针,需要用到 * 符号

// 声明一个指向整数的指针a

方式一:

int *a; 


方式二:

int* a;

2.2 指针获取地址

指针想要存放某个变量的地址,需要先使用取地址符  &  获取地址

int x = 10;
int *a = &x; // 将指针a初始化为变量x的地址

2.3 解引用 

想要获取这个地址值,需要使用  * 符号来访问, 这个过程称为解引用

int value = *a; // 获取a指针指向的值(等于x的值,即10)

2.4 指针与数组的关系

指针和数组之间有密切的关系,数组名本质上是一个指向数组第一个元素指针

PS:即不需要写出arr[0],直接写出arr即可,就能知道指针指向为数组的第一个元素arr[0]

int arr[3] = {1, 2, 3}; //声明一个数组,并将其初始化

int *a = arr; // 数组名arr就是指向arr[0]的指针


//arr[0]即文字阐述部分的:数组名即指向数组第一个元素的指针

2.5 指针的算术操作及访问

指针还可以执行加法、减法等算术操作,以访问内存中的不同位置。

int arr[5] = {1, 2, 3, 4, 5};

int *a = arr;  //指向数组的第一个元素

int value = *(a + 2); // 获取数组的第三个元素(值为3)

2.6 空指针值

一个特殊的空指针值,通常表示为nullptr,用于表示指针不指向任何有效的内存地址

int *a = nullptr; // 初始化为空指针

三、 链表

3.1 概念

与数组不同,链表的元素存储可以是连续的也可以是不连续的,每个数据元素处理存储本身的信息(data数据域)之外,还存储一个指示着下一个元素的地址的信息(next指针域),即这些元素是通过一条“链”串起来的。

链表的第一个节点的存储位置被称为头指针,然后通过next指针域找到下一个节点,直到找到最后一个节点,最后一个节点next指针域并不存在,也就是“空”的,在C++中,null来表示这个空指针。 

3.2 虚拟头节点

为了简化链表的插入和删除操作,我们经常在链表的第一个节点前添加一个节点,称为虚拟头节点(dummyNode),头节点的数据域可以是空的,但是指针域指向第一个节点的指针

头指针是链表指向第一个节点的指针,访问链表的入口,经常使用头指针表示链表头指针是链表必须的

头节点是为了方便操作添加的,不存储实际数据,头节点不一定是链表必须的

详细的链表理论基础知识

3.3 定义链表节点

使用struct结构体来包含链表的数据域名、又包含指针域的复合结构。

//声明一个结构体类型 Books,变量为 book
struct Books{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book;

struct type_name{

member_type1      member_name1;

member_type2      member_name2;

member_type3      member_name3;

. .

} object_names;

3.4 结构体的成员变量

结构体可以组合多个不同类型的成员变量,成员变量可以是各种数据类型,包括整数、浮点数、字符串、其他结构体等,所以你可以根据需要定义自己的结构体来组织数据。

// 链表节点结构体
struct ListNode {
    int val;  // 存储节点的数据
    ListNode *next; // 下一个节点也是链表节点,所以也是ListNode类型,*表示指针(地址),next是名称
}

3.5 初始化结构体

初始化结构体的方式有很多,这里我们使用构造函数的方式来进行,构造函数的名称与结构体的名称相同,和其他函数不一样的是,构造函数没有返回类型,除此之外类似于其他的函数,构造函数也有一个(可能为空)的参数列表和一个函数体(可能为空)。链表结构体的构造函数代码如下:

 ListNode(int x) : val(x), next(nullptr) {}

ListNode(int x)表示:定义一个接收整数参数XListNode的构造函数(名称和结构体相同)

 : 表示:初始化列表的开始

val(x)表示:链表数据域的值被初始化为传递的参数 x 

next(nullptr)表示:next指针被初始化为nullptr表示没有下一个节点

3.6 完整结构体代码

完整代码定义一个ListNode结构体,用于表示链表中的一个节点,包含存储节点数据的数据域和存储下一个节点地址的指针域。

// 链表节点结构体
struct ListNode {
    int val;  // 存储节点的数据
    ListNode *next; // 指向下一个节点的指针	
  // 构造函数,用于初始化节点, x接收数据作为数据域,next(nullptr)表示next指针为空
    ListNode(int x) : val(x), next(nullptr) {}

};

四、 链表的插入

4.1 操作思路

  • 创建一个新的链表节点,初始化它的值为val

  • 将新的节点放入到链表的尾部,接入链表,也就是原来链表尾部的指针next指向新节点

  • 新接入的链表节点变为链表的尾部

PS:①中的next指向null,是指新节点的next指针指向原链表的null

ListNode *newNode = new ListNode(val); // 通过new构造一个新的节点,节点的值为val
cur -> next = newNode; // cur节点的next节点是新节点,从而将新节点接入链表
cur = cur -> next;      // 新插入的节点变更为新的尾节点,即cur发生了变更

4.2 new运算符和箭头语法->

new是一个运算符,它的作用就是在堆内存中动态分配内存空间并返回分配内存的地址使用方式一般为指针变量 = new 数据类型, 比如下面的代码

int *arr = new int[5]; // 分配一个包含5个整数的数组的内存空间,并返回一个地址,指针arr指向这个地址

箭头语法(->):用于通过指针访问指针所指向的对象的成员,cur 是一个指向 ListNode 结构体对象的指针,而 next 是 ListNode 结构体内部的一个成员变量(指向下一个节点的指针)。使用 cur->next 表示访问 cur 所指向的节点的 next 成员变量。

五、 题解

#include <iostream>
using namespace std;

//定义一个链表节点
struct lianbiao{
    int val; //整数类型的val
    lianbiao  *next;
    lianbiao(int x) : val(x), next(nullptr){} 
};

int main(){
    int n, val;
    
    //定义虚拟头节点,其节点值为0,dummHead指向其地址
    lianbiao *dummyHead = new lianbiao(0);  
    
    while(cin >> n){
        lianbiao *w = dummyHead; //定义一个临时变量w,构建链表
        
        for(int i = 0; i < n; i++){
            cin >> val; //输入值
            
            //根据读取的值,创建一个新的链表节点,并初始化其值为val
            lianbiao *newjiedian = new lianbiao(val);
            
            w -> next = newjiedian; //将新节点newjiedian加入链表
            w = w -> next; //临时变量w指向下一个节点
        }
        w = dummyHead; //将虚拟头节点给临时变量w
        
        //遍历链表的节点并逐个输出
        while(w -> next != NULL){
            cout << w -> next -> val << " ";
            
            w = w -> next;
        }
        cout << endl;
    }
    
}


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

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

相关文章

TikTok与媒体素养:如何辨别虚假信息?

在当今数字时代&#xff0c;社交媒体平台如TikTok已经成为信息传播和社交互动的主要渠道之一。然而&#xff0c;随之而来的是虚假信息的泛滥&#xff0c;这对用户的媒体素养提出了严峻的挑战。本文将探讨TikTok平台上虚假信息的现象&#xff0c;以及如何提高媒体素养&#xff0…

Servlet---常见错误汇总+解决

文章目录 404错误路径错误toncat没有正确加载webapp里的内容 405错误500错误出现“空白页面”出现“无法访问此网站” 我们在开始学习Servlet后&#xff0c;进入了前后端交互的阶段。在这个过程中&#xff0c;往往会发生许多的错误让我们摸不着头脑&#xff0c;今天小编就汇总了…

Pixhawk+PX4+VRPN +NOKOV无人机飞控平台动捕数据传输

NOKOV度量动作捕捉系统可以很好的适配PX4无人机飞控平台。进行数据通信的时候&#xff0c;使用SDK或者VRPN的方式都是可以的。本文演示NOKOV度量动作捕捉系统通过VRPN与PX4平台进行数据传输的方法。 一、硬件准备 1、准备无人机 这里准备的无人机&#xff0c;飞控版是Pixhaw…

O2OA(翱途)开发平台 V8.2即将发布,更安全、更高效、更开放

尊敬的O2OA(翱途)平台合作伙伴、用户以及亲爱的开发小伙伴们&#xff0c;平台新的版本就要发布啦&#xff01; 上次8.1的发布是在9月1日&#xff0c;又过去两个多月&#xff0c;O2OA研发团队始终踏踏实实地做好产品的研发及优化工作&#xff0c;只为给客户带去更好的服务和产品…

好用的企业防泄密软件盘点

企业防泄密软件是专门设计用于保护企业敏感信息不被泄露的软件产品。这类软件通常采用多种安全技术和策略&#xff0c;以增强企业数据的安全性和保密性&#xff0c;防止核心知识产权和商业机密的泄露。 企业防泄密软件的主要功能包括数据加密、访问控制、审计和监控、文件和数据…

tomact部署Nginx 高负载

准备工具 安装jkd 双击程序开始安装, 点击下一步 选择安装路径 安装完成,点击关闭 配置java的环境变量 鼠标右键点击车我的电脑,选择属性点击 系统设置 点击环境变量 点击下方的新建 变量名输入JAVA_HOME 变量值输入jdk安装的路径 点击确认 在系统变量中找到path,然后点击…

JSON.toJSONString/JSONObject.toJSONString将实体类对象转换成JSON字符串时,多出了params字符串[记录贴]

我这里是给与了实体类一些固定的默认值&#xff0c;转换莫名其妙多出了params参数&#xff0c;回头深挖一下 **光看代码了 被偷了后方&#xff0c;忘记继承了还 ** 将实体类转换成JSON格式&#xff0c;三种写法都是一样的&#xff0c;内核都是阿里巴巴的 System.out.println(…

内网信息收集-网络安全

目录 本机信息收集 查看系统配置信息 查看系统服务信息 查看系统登录信息 自动信息收集 域内信息收集 判断是否存在域 探测域内存主机&端口 powershell arp扫描 小工具 telnet 查看用户&机器&会话相关信息 查看机器相关信息 查看用户相关信息 本机信…

处理机器学习数据集中字符串列(pandas.get_dummies)

如图&#xff0c;在数据集中week列的数据不是数值型&#xff0c;会导致我们在训练过程中难以处理。 而pandas库中有一个非常好用的函数&#xff0c;独热编码pandas.get_dummies(df) 使用此函数之后&#xff0c;会在原数据中新建各列代表Fri-Sun&#xff0c;值为0或1&#xff…

半平面求交 - 洛谷 - UVA1475 Jungle Outpost

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 往期相关背景点击前往 题目大意 题目链接 https://www.luogu.com.cn/problem/UVA1475 在丛林里有n个瞭望塔&#xff0c;瞭望塔的保护范围就是一个凸n多边形&#xf…

如何选择适合企业的ERP管理系统?

如何选择适合企业的ERP管理系统&#xff1f; 企业业务不断发展和扩大&#xff0c;ERP管理系统已成为企业实现信息化管理、提高工作效率、降低成本的重要工具。然而&#xff0c;市场上ERP管理系统种类繁多&#xff0c;如何选择适合自己企业的ERP管理系统成为了企业面临的难题。…

陪诊系统定制|陪诊系统实现个性化医疗陪护

随着社会的发展和人口老龄化的加剧&#xff0c;医疗陪诊服务逐渐成为了人们生活中不可或缺的一部分。为了满足这一需求&#xff0c;越来越多的创业者开始关注陪诊小程序的开发。那么&#xff0c;陪诊小程序源码如何开发呢&#xff1f;本文将探讨陪诊系统源码开发的意义、关键功…

java:springboot单元测试spring-boot-starter-test

背景 Java的单元测试可以使用多个框架&#xff0c;其中比较流行的包括&#xff1a; JUnit&#xff1a;JUnit是Java单元测试最常用的框架&#xff0c;它提供了一套丰富的API&#xff0c;可以方便地编写测试用例和测试套件。JUnit 5是JUnit的最新版本&#xff0c;引入了许多新功…

电源模块输出过冲如何产生?测试标准及其测试方法是什么?

输出电压过冲是一个常见的电路问题&#xff0c;它是指在电路中的电压超过了规定的范围&#xff0c;严重的话会造成系统不稳定&#xff0c;导致元器件、负载以及设备损坏。那么造成输出电压过冲的原因有哪些呢&#xff1f;电源自动测试系统要怎么测试输出过冲? 输出电压过冲产生…

DMA covert communication

DMA隐蔽通信的新思路 拆分DMA的RF链 思路的主要来源: article{Ci2021HybridBD, title{Hybrid Beamforming Design for Covert Multicast mmWave Massive MIMO Communications}, author{Wei Ci and Chenhao Qi and Geoffrey Ye Li and Shiwen Mao}, journal{2021 IEEE Global …

项目技术复盘

背景 该项目接手时已是8月中下旬&#xff0c;并且客户要求九月中旬输出第一版本。这么紧急的节奏&#xff0c;不知道商务是如何答应的。临危受命&#xff0c;让我承担开发经理岗位&#xff0c;主导该项目。 开发团队 岗位 人员 base 架构师兼高级软件工程师 季工 上海 高…

Isight 2023 新功能介绍

​​Isight是一个仿真分析流程自动化和多学科多目标优化工具&#xff0c;它提供了一个可视化的灵活的仿真流程搭建平台&#xff0c;同时提供与多种主流CAE分析工具的专用接口&#xff0c;利用此工具&#xff0c;用户可以方便的以拖拽的方式可视化的快速建立复杂的仿真分析流程&…

榜首揭秘:热门产品原型设计工具TOP10

在现代产品制作和创新过程中&#xff0c;原型设计工具起着不可或缺的作用。这些工具为设计师、开发人员和团队提供了更深入的理解&#xff0c;以便核实和呈现他们的设计想法。根据项目的特性&#xff0c;可能需要使用各种类型的工具&#xff0c;因此&#xff0c;我们将在此篇文…

最新随机小姐姐无水印开源版HTML源码

推荐一款高质量的HTML引流源码&#xff0c;适合浏览小姐姐短视频 这款源码具有出色的用户界面设计&#xff0c;给人视觉上的美感 视频播放流畅稳定&#xff0c;给用户带来良好的观影体验 小姐姐们的外貌也非常美丽吸引人 想要浏览精彩的小姐姐短视频&#xff0c;不妨试试这款…