目录
一.链表与数组
链表是我们用来存储数据其中的一个方式,其中链表常用来与数组进行比较,链表和数组各自有其自己的优缺点。下面我们将这两个存储方式进行比较:
1.数组
数组想必大家都已经熟知了,它是一种存储方式,分配连续的内存空间来存储数据,数组存储数据的时间复杂度为o(1),这是因为数组是利用下标定位的一个连续的内存空间,但对于增删查改等操作的时间复杂度为o(n),需要对数据进行移位为新数据腾出空间。
数组的优点
1.查找速度快
2.随机访问性强
利用下标查找的方式可以很快速便捷准确的找到用户所需要的信息。
数组的缺点
1.对于增删查改等操作比较耗时
2.不能动态的分配内存空间
3.对内存的要求高,必须要一片连续的内存空间存储
4.会造成内存浪费,使用数组前需要先确定数组长度,容易造成内存浪费
2.链表
链表是由一个一个的结点组成的链式结构。每一个结点有数据域(data)和指针域(next)。数据域用来存储信息,指针域用来连接下一个结点,链表就是通过这样的巧妙方法来实现链接的。链表存储数据的时间复杂度为o(n),但对于增删查改等操作的时间复杂度为o(1),这得益于它特殊的存储方式。
链表的优点
1.增删查改速度快
2.可动态分配内存空间,便于后期的添加
3.内存的要求低,内存不需要连续存储
链表的缺点
1.存储信息速度慢
2.随机访问性弱,需要遍历整个链表
通过数组与链表的比较,想必大家对链表有了初步的认识。接下来让我来为大家讲解一下链表的实现以及一些常用的操作。
二.链表的实现
结点
链表由一个一个结点组成,结点的数据域(data)用来存放用户所需要存储的数据,指针域用来存储下一个结点的地址,我们要写一个链表我们首先要创建一个结点的结构体来存储数据以及下一个结点对应的地址。代码实现如下:
需要注意的点在于指针域的类型,因为它是指向下一个结点,结点的类型是simpleList。所以指针类型为simpleList*类型,创建好了链表结构体这样就可以创建结点了
创建的过程其实也是初始化的过程。我们学习c语言的知道要让指针能当作变量使用的两种方法,一是让指针指向变量,二是为指针分配一块动态空间供其所用,这里就是对应的第二种方法。
头结点
链表是由一个一个结点组成的,其中头结点是链表的“灵魂”。我们寻找一个链表的方法就是找到它头节点的地址。每个结点都由数据域(data)和指针域(next)组成,但是头结点不一样。头结点只有指针域,这是它与其它结点的区别所在。我认为头结点就相当于数组名,一个便于我们找到对应的链表,一个便于我们找到对应的数组。头结点的创建也是至关重要的一环,代码实现如下:
这样我们就创建好了链表的必备元素,接下来让我们学习一下对链表的一些常用操作,以及对应代码的实现吧!
三.链表的常用操作
1.插入链表
插入链表我们有两种方式,一是头插法,二是尾插法。顾名思义,头插法就是在链表的头部插入新的结点,尾插法则是在链表的尾部插入新的结点。接下来由我来为大家讲解一下头插法来实现插入链表,尾插法则留给大家自己思考咯。
头插法的示意图就是这样了(字丑求轻喷)。要实现头插法很好理解,让新结点的指针域指向头结点后面的那个结点(headnode->next),然后让头结点的指针指向新的结点,这样新的结点就可以插入该链表了。代码实现如下:
2.打印链表
想要读取链表的数据需要对链表进行打印操作,就是遍历一遍链表。实现也是很简单的,我们可以与上学时升国旗站队类比,现在所有同学站成一排(就是一个链表),带头的同学手拿🚩(头结点),🚩也是为了区分他与其他同学有何区别。现在我们需要收同学们手上的纸条从拿旗子同学的后面一位同学开始,依次收取,收到最后,最上面的纸条是最后一位同学的,所以发放时也是第一个发放链表最后一位。代码实现如下:
pmove就时收纸条的“狗腿子”,我们使用这个函数来打印一下链表,看看它的性质
我们可以发现我们插入链表的是012的顺序,打印出来是210,这就是链表的“先进后出”性。
后结
我们将链表和数组进行了比较,以及链表的实现和相关的常用操作,相信大家对链表已经有了一定的理解,后续我会继续分享我在学习编程中的心得以及经验供大家参考学习,如有错误地方希望大家指正,不懂的地方也可以发在评论区我们一起探讨,让我们共同努力早日成为编程高手!