链表和线性表的优缺点
作为我们最先接触的两个数据结构,链表和线性表的优缺点都较为明显,并且二者互相补足
线性表
线性表的组成
首先,我们来谈谈线性表SeqList
线性表 (linear list) 是 数据结构 的一种,一个线性表是n个具有相同特性的数据元素的有限序列。类似于数组,其本质是一块连续的地址空间
图片来自百度
因为其内容包含多个变量,所以C语言使用结构体来构造
共三个变量:
1.所存储数据类型的指针,用来接收之后malloc,动态开辟的空间
2.Size,表示当前线性表所存储元素个数
3.Capacity,表示当前线性表所能存储的最大元素个数
详细的实现这里就不赘述了
接下来是就来讲解线性表的缺点
线性表的缺点
如线性表的本质所表现的,线性表是一块连续的空间,如同数组一样,我们需要手动开辟,而且需要指定大小的开辟。
那么就出现第一个问题,开辟多大的空间呢?
这只是问题的表层,很多人也知道,即使我们开辟的过大,过小,我们都可以通过realloc,重新开辟空间,并且realloc可以帮我们copy原先的数据.
但这又有个问题,realloc多大呢,我们总不能插入一个数据,就重新realloc一块比原先空间多一的空间吧?比较适合的扩大数目是—原先的两倍。
但这样也会在后来造成内存浪费,比如我要存130,原先100,那就要realloc200的空间,70个空间将造成浪费
所以,线性表的第一个缺点:容易造成空间浪费
PS:realloc会考察原先空间后是否有足够的空间,若有,是原地扩容。
若没有足够空间,则会在别处申请一块空间,并拷贝原先的值
第二个缺点:头部中间插入和删除效率低
当我们要在线性表的头部或中间插入和删除元素时,我们需要将位置后的元素,往后移动,这就导致效率低
但是,线性表也并不是一无是处
线性表的优点
同样,因为线性表的本质,是一块连续的空间
线性表可以通过下标访问元素,很多算法是需要兼容这一点的,比如快排和二分查找
链表
链表和线性表有很大不同
最明显的还是数据的存储,链表并不是连续的地址空间,他是无序的,散的,但这并不违反其线性结构,因为其组成有指针指向当前链表的下一个节点,实现数据的线性联系
链表的组成
链表内部主要有三大区分
循环 非循环
带哨兵卫的头 不带头
单向 双向
因此,链表有八种类型
其中单向,不带头,非循环链表是oj题最常见的,因为其结构简单,功能少,所以相应的题考验学生的思维能力。
而双向,带头,循环链表是结构最复杂,全面的链表,所以其功能较为强大
此处举例双向,带头,循环链表
图片来自百度
链表的优点
任意位置插入删除效率高
因为链表并不是连续的空间,插入和删除只要对指定位置的前后做操作就好
并且通过封装的FindList函数,O(N)的查找,再在指定位置插入删除O(N)即可
按需申请释放空间
每一次的插入删除,只需要申请一块空间即可,和原本的空间没有影响
实际操作,链表会更为的舒服
但链表的缺点也很明显
链表的缺点
不支持随机访问。(用下标访问)
意味着,一些排序,二分查找,等算法在这种结构不适用
总结
大致的线性表和链表的总结就到这。
一句话,数据结构是数据存储,应用的框架,容器。
具体使用要依情况而定
文章如果有不对或者不足的地方,欢迎大佬们指正,补充。感谢大家的阅读,如果感觉博主写的还可以,麻烦点个赞支持一下,阿里嘎多。拜托了,这对我真的很重要~