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个数据,我想要在这个这里插入一下,怎么办?那它的下一个指向它那新的下一个指向这个。链表很灵活,
那下一小章,我们来正式的来学习链表,它是个好东西,不要怕它啊,学会以后合理的使用它。