中年|C/C++编程笔记:同样是数据类型,链表对比数组?哪个更香?


说起链表 , 第一反应:链表是一种数据类型!它可以用来存储同种类型多个批量数据 。
中年|C/C++编程笔记:同样是数据类型,链表对比数组?哪个更香?
本文插图

有了这种认知 , 很容易去联想到数组 , 它也是一种数据类型 , 也可以用来存储同种类型的批量数据 。 初学者往往对数组的印象比较好 , 比如想要存一批整数 , 就可以定义一个一维整形数组 , 用数组存储 , 简单直观且方便 。
那为什么要引入链表呢?
这里主要的原因是数组它是有缺点的:首先 , 数组是采用静态分配的方式 。
什么意思呢?就是说你想在程序中用数组 , 就要先定义数组 , 写一个说明语句放在执行语句之前 。 我们的变量都是先定义后使用的嘛 , 在这个说明语句的部分 , 数组的长度已经被判死刑了 。
在后续操作中 , 我们既无法对已分配的存储单元进行扩充或者更变 , 也不能通过编程的方式对没有充分利用的资源进行回收 , 这就是所谓的静态分配 。
中年|C/C++编程笔记:同样是数据类型,链表对比数组?哪个更香?
本文插图

有同学可能有疑问 , 静态就静态呗 , 有什么问题吗?问题在于 , 在某些情况下 , 你无法确定数据的大致规模 , 或者数据规模需要针对不同用户进行相应的调整 。

比如说 , 对于一个学生管理系统 , 采用数组的方式存储数据的话:如果用户是一个班级 , 100个单元就够用;对于一个院系 , 可能要1000个单元;对于几个院系 , 可能要上万个单元 。
那么你想让自己的系统能够同时满足这些用户的需求 , 就理应采用最大的规模 , 也就是应该在说明语句中把数组的规模做到一万 。 而只要定义了变量 , 系统就会分配存储单元 。
实际应用中 , 哪怕只用到其中的1个单元 , 系统也会分配一万的单元 , 多余的单元程序不会使用到 , 别的变量也没办法用 , 属于典型的占着什么不什么 。
数组的另外一个缺陷是:必须使用连续的内存单元 。 对于一个领着100个游客住旅馆的导游 , 如果采用数组方式住店 , 假如旅店的空房间数量远远多于100个 , 但任何一个地方都没有连续的100个房间 。
那就比较尴尬了 , 老板娘只好提示你系统内存空间不够 , 不让你住店 , 也不让你的程序执行 。
那么将来我们引入链表就可以巧妙地解决这两个问题:首先我们的链表不是在执行语句运行前提前定义的 , 而是可以按照用户的需求动态分配 , 更加灵活高效;其次 , 采用链表方式也需要内存单元 , 但是不再需要连续的内存 。

那讨论到这里的话:链表这么完美 , 数组全是缺点 , 以后全部用链表不就好了吗?
中年|C/C++编程笔记:同样是数据类型,链表对比数组?哪个更香?
本文插图

但是链表也有缺点 。 比如说它定义形式更加复杂 , 给编程者有一定的学习门槛;无法直接定位链表中某一个元素 , 而只能通过前导依次遍历会降低访问效率等等 。
在开发实践中 , 到底应该使用哪种数据类型 , 应该根据实际需要灵活变动 , 不能而在某一种方式上钻牛角尖 。
对于更多的开发人员而言 , 我们对自己的定位应该是语言的使用者 , 而非语言的研究者 。 所以编程实践中 , 如何采用合理、高效有用的方式才是我们真正需要考虑的东西 , 而非去一味追求刁钻的技巧技法 , 千万不要陷入“能力的怪圈” 。
感谢阅读 , 学习使人强大 。
自学C/C++编程难度很大 , 如果你想更快提升自己的编程能力和编写项目的水平 , 欢迎一起共同成长!
C语言C++编程学习交流圈子 , 关注+私信【C/C++编程】微信公众号:C语言编程学习基地
有一些源码和资料分享 , 欢迎转行也学习编程的伙伴 , 和大家一起交流成长会比自己琢磨更快哦!


推荐阅读