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

 

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

那为什么要引入链表呢?

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

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

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

 

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

比如说,对于一个学生管理系统,采用数组的方式存储数据的话:如果用户是一个班级,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. 操作DOM对象

    操作DOM对象 目录 操作DOM对象 1. 核心 2. 获得Dom节点 3. 更新节点 1. 操作文本 2. 操作CSS 4. 删除节点 5. 插入节点 1. 追加(将已存在的节点移到后面) 2. 创 ...

  2. python应用 曲线拟合04

    python应用 曲线拟合04 → 多项式拟合 主要是使用 numpy 库中的 polyfit() 函数,见第 66 行, z = np.polyfit(x_proton, y, 3) ,其中待拟合曲 ...

  3. Go语言 | 并发设计中的同步锁与waitgroup用法

    今天是golang专题的第16篇文章,我们一起来聊聊golang当中的并发相关的一些使用. 虽然关于goroutine以及channel我们都已经介绍完了,但是关于并发的机制仍然没有介绍结束.只有go ...

  4. selenuim常用api

    1.通过代码跳转到页面的方法:前提:已安装驱动,并加入到path下 安装ie驱动或火狐驱动的情况: 2.当链接跳转按钮在页面最上方时,用window.scrollTo(0,0);显示在页面最上方后,再 ...

  5. Linux rndis_host 驱动的一个BUG与解决方案

    关键字 rndis_host, linux, kernel, modem 综述 rndis 是微软定义的一套通讯方案.类似的协议还有 qmi/mbim/ecm/ncm. rndis 协议足够简单,可靠 ...

  6. 内存管理初始化源码1:setup_arch

    源码声明:基于Linux kernel 3.08 1. 在kernel/arch/mips/kernel/head.S中会做一些特定硬件相关的初始化,然后会调用内核启动函数:start_kernel: ...

  7. Linux中逻辑卷(LV)的创建、增大和减小

    首先说一下在缩小逻辑卷的时候要注意的问题:第一步使用resize2fs命令更改文件系统的容量:第二步使用lvreduce命令减小逻辑卷的容量.这两个顺序千万不要搞反了,而且要保证缩减后的逻辑卷容量大于 ...

  8. VS2017报错:未识别符vector

    解决办法:添加头文件#include<vector>,添加命名空间 using namespace std.

  9. hystrix源码小贴士之Servo Publisher

    HystrixServoMetricsPublisher 继承HystrixMetricsPublisher,创建HystrixServoMetricsPublisherCommand.Hystrix ...

  10. C语言专项错题集

    2020-08-10 记录 #1 1 struct student{ 2 int num; 3 int age; 4 }; 5 struct student stu[3]={{6001,20},{60 ...