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

P1 什么是链表 C语言简单易懂

目录

前言

01 什么是链表

02 数组的特点 

03 数组的缺点

3.1 删除数组其中一个元素

3.2 数组增加某个节点

04 链表


前言

                                 

🎬 个人主页:@ChenPi

🐻推荐专栏1: 《 C++ 》✨✨✨ 

🔥 推荐专栏2: 《 Linux C应用编程(概念类)》✨✨✨

📝推荐专栏3: ​​​​​​《链表_@ChenPi的博客-CSDN博客》 ✨✨✨
🍉本篇简介:>:讲解链表的运行方式和链表和数组的区别

这一节,我们来讲解链表。很多很多人看到链表两个字啊,就觉得怕,其实它不可怕的,而且很好用,现在我们就来讲解链表

01 什么是链表

它就是一个普通结构体的应用而已。

链表啊,它是一个好东西啊,之所以能够存在列表这个东西,说明它能够帮忙解决一些实际问题。

链表只是一种数据结构。

那所谓的数据结构就是数据存放的思想。

明我们说编程难的并不是c语言本身,

而是一些思想。其中,链表就是一种数据存放的一种思想。

02 数组的特点 

我们以前学过数据存放,也可以说数据的一个集合。

学过数组吧,大家都对这个数组很熟悉

他非常明白了一个特点是。每一个元素地址。都是连续的。

比如说我们一个数组arr。

int arr[10] = {0,1,2,3,4,5,6,7,8,9,10};

其中有10个数据,比如说12345678910啊。

它就是在内存连续的一段空间。存放123456  直到10啊,假设这个初始地址是你0x00啊,那么第二个是0x0,int整形数的大小是四个字节,地址是连续的,也就是说。最大空间就是10*4 = 40

数组的特点就是在一个连续的内存空间里面存放着某些特点的数据

这是它的特点啊,一种比较特别的数据存储方式 

03 数组的缺点

那这样有什么缺点吗?

数组的话改其中的数据或者查询数据的话其实还好

但是如果你要增加一个元素呢?你要删除一个元素呢?

3.1 删除数组其中一个元素

删除一个元素是不是很很困难?

数组的地址是连续的

假设说,我这个第三个元素被我干掉了。那你该如何处理这个地址空间,

它的数据已经变得不连续了。

如果要把右边的数据都往左移

你的运算量就比较大了,你要挪动整个数组。

3.2 数组增加某个节点

比如说我要在这个六跟七之间啊,加一个11啊,怎么办啊?

因为他们地址连续的代表这个空间是没有多余的内存的,

实际上,你要把11存放进来,你首先要数到六,然后把七八九十往后挪一挪,

腾出一个位置给11啊,你的内存的开销,你的运算量肯定会变大的,所以说不灵活

而且数组一开始的时候就把大小给确认了,所以说不管是malloc也好,还是数组,也是都是一口气申请了多大的空间啊,他们都存在这个问题不灵活,

04 链表

那链表表就很好的解决了这个问题。列表的每一项,它都是一个结构体。

struct Node {int value; // 值Node *next; // 下一个节点指针
};

比如说我现在有一个链表,

里面有两项一项是一个整形数的一个数据value

下一个是一个指针,struct Node * test

比如说现在有这个结构体1

结构体1里面有个指针,我结构体1的指针指向结构体2的地址,结构体2的指针指向结构体3的地址,也就是说这几个结构体是被串联在一起的

这样子无疑就给整个数据的存储添加了很大的灵活性,比如说我现在有这么一串数啊,12345。

我先要把三删掉,那不很简单吗,把二里面存放的地址改成四嘛就完了删就删掉了就一句话

如果要是数组的话呢?12345,你把3删掉,删掉以后,这个内存啊,数据还得往前挪,五个数据还好,假设后面有100个数据?你都要挪多少次啊啊

如果是链表,那我这个后面有100个数据,是不是也很好处理啊?跟后面的数据没关系吧,我只要去变动二里面的指针地址只像是就可以了,多灵活是不是那我先要增加一下怎么办呢?

同样的我有100个数据,我想要在这个这里插入一下,怎么办?那它的下一个指向它那新的下一个指向这个。链表很灵活,

那下一小章,我们来正式的来学习链表,它是个好东西,不要怕它啊,学会以后合理的使用它。

相关文章:

  • MOS管的静电击穿问题
  • 2023年12月03日新闻简报(国内国际)
  • 机器学习中参数优化或交叉验证评估指标含义
  • ASP.NET Core 使用IIS调试出现505.24错误
  • 软件工程 - 第8章 面向对象建模 - 4 - 物理体系结构建模
  • 【C语言:数据在内存中的存储】
  • CSS 选择器优先级,!important 也会被覆盖?
  • Python与设计模式--模板模式
  • TCP网络常见名词
  • 第八章 django
  • mysql原理--重新认识MySQL
  • 外包搞了6年,技术退步明显......
  • Android监听用户的截屏、投屏、录屏行为
  • 重庆市失业金申领流程
  • RK3568平台开发系列讲解(Linux系统篇)netlink 监听广播信息
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  •  D - 粉碎叛乱F - 其他起义
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • Fundebug计费标准解释:事件数是如何定义的?
  • JAVA并发编程--1.基础概念
  • Mysql数据库的条件查询语句
  • Next.js之基础概念(二)
  • Tornado学习笔记(1)
  • webgl (原生)基础入门指南【一】
  • 第十八天-企业应用架构模式-基本模式
  • 力扣(LeetCode)22
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 一个完整Java Web项目背后的密码
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • MyCAT水平分库
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​Spring Boot 分片上传文件
  • (2)(2.10) LTM telemetry
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (转)Linux整合apache和tomcat构建Web服务器
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .Net IOC框架入门之一 Unity
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .net反编译的九款神器
  • .net开发时的诡异问题,button的onclick事件无效
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • [ 第一章] JavaScript 简史
  • [].slice.call()将类数组转化为真正的数组
  • [C++] 如何使用Visual Studio 2022 + QT6创建桌面应用
  • [C++]类和对象【上篇】
  • [C++]类和对象【下】