说起链表,第一反应:链表是一种数据类型!它可以用来存储同种类型多个批量数据。

 

有了这种认知,很容易去联想到数组,它也是一种数据类型,也可以用来存储同种类型的批量数据。初学者往往对数组的印象比较好,比如想要存一批整数,就可以定义一个一维整形数组,用数组存储,简单直观且方便。

那为什么要引入链表呢?

这里主要的原因是数组它是有缺点的:首先,数组是采用静态分配的方式。

什么意思呢?就是说你想在程序中用数组,就要先定义数组,写一个说明语句放在执行语句之前。我们的变量都是先定义后使用的嘛,在这个说明语句的部分,数组的长度已经被判死刑了。

在后续操作中,我们既无法对已分配的存储单元进行扩充或者更变,也不能通过编程的方式对没有充分利用的资源进行回收,这就是所谓的静态分配。

 

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

比如说,对于一个学生管理系统,采用数组的方式存储数据的话:如果用户是一个班级,100个单元就够用;对于一个院系,可能要1000个单元;对于几个院系,可能要上万个单元。

那么你想让自己的系统能够同时满足这些用户的需求,就理应采用最大的规模,也就是应该在说明语句中把数组的规模做到一万。而只要定义了变量,系统就会分配存储单元。

实际应用中,哪怕只用到其中的1个单元,系统也会分配一万的单元,多余的单元程序不会使用到,别的变量也没办法用,属于典型的占着什么不什么。

 

数组的另外一个缺陷是:必须使用连续的内存单元。对于一个领着100个游客住旅馆的导游,如果采用数组方式住店,假如旅店的空房间数量远远多于100个,但任何一个地方都没有连续的100个房间。

那就比较尴尬了,老板娘只好提示你系统内存空间不够,不让你住店,也不让你的程序执行。

那么将来我们引入链表就可以巧妙地解决这两个问题:首先我们的链表不是在执行语句运行前提前定义的,而是可以按照用户的需求动态分配,更加灵活高效;其次,采用链表方式也需要内存单元,但是不再需要连续的内存。

那讨论到这里的话:链表这么完美,数组全是缺点,以后全部用链表不就好了吗?

 

但是链表也有缺点。比如说它定义形式更加复杂,给编程者有一定的学习门槛;无法直接定位链表中某一个元素,而只能通过前导依次遍历会降低访问效率等等。

在开发实践中,到底应该使用哪种数据类型,应该根据实际需要灵活变动,不能而在某一种方式上钻牛角尖。

对于更多的开发人员而言,我们对自己的定位应该是语言的使用者,而非语言的研究者。所以编程实践中,如何采用合理、高效有用的方式才是我们真正需要考虑的东西,而非去一味追求刁钻的技巧技法,千万不要陷入“能力的怪圈”。


看到这里你是不是又学到了很多新知识呢~

如果你很想学编程,小编推荐我的C语言/C++编程学习基地【点击进入】!

都是学编程小伙伴们,带你入个门还是简简单单啦,一起学习,一起加油~

还有许多学习资料和视频,相信你会喜欢的!

涉及:游戏开发、常用软件开发、编程基础知识、课程设计、黑客等等......

 

 

【C/C++编程入门学习】同样是数据类型,链表对比数组?哪一个更香?的更多相关文章

  1. C、C++、Java到Python,编程入门学习什么语言好?

    摘要:回顾编程语言几十年来的兴衰起伏,似乎也折射了整个信息产业的变迁消亡,想要在技术的洪流里激流勇进,找准并学精一两门编程语言更加显得至关重要. 最近,TIOBE更新了7月的编程语言榜单,常年霸榜的C ...

  2. OPENSSL编程入门学习

    相关学习资料 http://bbs.pediy.com/showthread.php?t=92649 https://www.openssl.org https://www.google.com.hk ...

  3. cg语言学习&&阳春白雪GPU编程入门学习

    虽然所知甚少,但康大的<GPU编程与Cg编程之阳春白雪下里巴人>确实带我入了shader的门,在里面我第一次清晰地知道了“语义”的意思,非常感谢. 入门shader,我觉得可以先读3本书: ...

  4. 【C/C++编程入门学习】C语言结构体硬核玩法分享,一切皆是数据!

    前言 对于结构体的应用太多了,今天这篇文章我主要为大家总结平时关于结构体的一些独特硬核小技巧,对于结构体更多优秀的编程表现,如果你对结构体的基础知识还不具备的话得回头看一下专栏教程或者自己找本书籍学习 ...

  5. Lua编程入门-学习笔记2

    第6章 深入函数 函数是一种“第一类值(First-Class Value)”,他们具有特定的词法域(lexical scoping) 将表达式“function(x) <body> en ...

  6. Lua编程入门-学习笔记1

    第1章:起点 Chunks: 语句块 每个语句结尾的分号是可选的,如果同一行有多个语句最好使用分号分隔: dofile("lib1.lua")  -- 执行lua文件 全局变量:局 ...

  7. opencv3 编程入门学习笔记(一): 基本函数介绍

    滤波 blur (均值滤波) 均值滤波是典型的线性滤波算法, 主要方法为领域平均法(即用一片图像区域的各个像素的平均值来代替原图像中的各个像素值) 缺点: 不能很好的保护图像细节, 在图像去噪的同时也 ...

  8. 大牛整理最全Python零基础入门学习资料

    大牛整理最全Python零基础入门学习资料 发布时间:『 2017-11-12 11:56 』     帖子类别:『人工智能』  阅读次数:3504 (本文『大牛整理最全Python零基础入门学习资料 ...

  9. C语言编程入门之--第四章C语言基本数据类型

      导读:C语言程序中经常涉及一些数学计算,所以要熟悉其基本的数据类型.数据类型学习起来比较枯燥,不过结合之前的内存概念,以及本节的字节概念,相信数据类型也就不难理解了.本章从二进制的基本概念开始,然 ...

随机推荐

  1. 关于HTML基本标签,了解一下!

    目录 1 前言 2 正文 2.1 HTML文档结构 2.1.1 html标签 2.1.2 head标签 2.1.3 title标签 2.1.4 body标签 2.2 HTML常用标签 2.2.1 换行 ...

  2. python格式化输出当前时间

    import time def get_now_time(): now_time = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.tim ...

  3. 循环删除list的方法

    错误的方法: 正确的方法:

  4. Linux驱动之设备树的基础知识

    前期知识   1. 如何编写一个简单的Linux驱动(一)--驱动的基本框架   2. 如何编写一个简单的Linux驱动(二)--设备操作集file_operations   3. 如何编写一个简单的 ...

  5. 初等函数——指数函数(Exponential Function)

    一般地,函数叫做指数函数,其中x是自变量,函数的定义域是R.

  6. Java 审计之SSRF篇

    Java 审计之SSRF篇 0x00 前言 本篇文章来记录一下Java SSRF的审计学习相关内容. 0x01 SSRF漏洞详解 原理: 服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过 ...

  7. JVM--堆是分配对象的唯一选择么?

    在<深入理解Java虚拟机>中关于Java堆内存有这样一段描述:随着JIT编译期的发展与逃逸分析技术逐渐成熟,栈上分配.标量替换优化技术将会导致一些微妙的变化,所有的对象都分配到堆上也渐渐 ...

  8. 关于java中循环的学习

    switch 值是固定的 效率高语法:switch (表达式) { case 常量 1: 语句; break; case 常量 2: 语句; break; … default: 语句; break;} ...

  9. 分布式系统监视zabbix-安装

    zabbix概述 Zabbix是什么 Zabbix 是由Alexei Vladishev创建,目前由Zabbix SIA在持续开发和支持. Zabbix 是一个企业级的分布式开源监控方案. Zabbi ...

  10. redis连接池参数动态化

    有的时候要从后端获取数据,真实的key可能在参数之上做一些修改,查了下set-misc模块,set_unescape_uri命令支持变量替换 location ~ /get_redis$ {      ...