【C/C++编程入门学习】同样是数据类型,链表对比数组?哪一个更香?
说起链表,第一反应:链表是一种数据类型!它可以用来存储同种类型多个批量数据。
有了这种认知,很容易去联想到数组,它也是一种数据类型,也可以用来存储同种类型的批量数据。初学者往往对数组的印象比较好,比如想要存一批整数,就可以定义一个一维整形数组,用数组存储,简单直观且方便。
那为什么要引入链表呢?
这里主要的原因是数组它是有缺点的:首先,数组是采用静态分配的方式。
什么意思呢?就是说你想在程序中用数组,就要先定义数组,写一个说明语句放在执行语句之前。我们的变量都是先定义后使用的嘛,在这个说明语句的部分,数组的长度已经被判死刑了。
在后续操作中,我们既无法对已分配的存储单元进行扩充或者更变,也不能通过编程的方式对没有充分利用的资源进行回收,这就是所谓的静态分配。
有同学可能有疑问,静态就静态呗,有什么问题吗?问题在于,在某些情况下,你无法确定数据的大致规模,或者数据规模需要针对不同用户进行相应的调整。
比如说,对于一个学生管理系统,采用数组的方式存储数据的话:如果用户是一个班级,100个单元就够用;对于一个院系,可能要1000个单元;对于几个院系,可能要上万个单元。
那么你想让自己的系统能够同时满足这些用户的需求,就理应采用最大的规模,也就是应该在说明语句中把数组的规模做到一万。而只要定义了变量,系统就会分配存储单元。
实际应用中,哪怕只用到其中的1个单元,系统也会分配一万的单元,多余的单元程序不会使用到,别的变量也没办法用,属于典型的占着什么不什么。
数组的另外一个缺陷是:必须使用连续的内存单元。对于一个领着100个游客住旅馆的导游,如果采用数组方式住店,假如旅店的空房间数量远远多于100个,但任何一个地方都没有连续的100个房间。
那就比较尴尬了,老板娘只好提示你系统内存空间不够,不让你住店,也不让你的程序执行。
那么将来我们引入链表就可以巧妙地解决这两个问题:首先我们的链表不是在执行语句运行前提前定义的,而是可以按照用户的需求动态分配,更加灵活高效;其次,采用链表方式也需要内存单元,但是不再需要连续的内存。
那讨论到这里的话:链表这么完美,数组全是缺点,以后全部用链表不就好了吗?
但是链表也有缺点。比如说它定义形式更加复杂,给编程者有一定的学习门槛;无法直接定位链表中某一个元素,而只能通过前导依次遍历会降低访问效率等等。
在开发实践中,到底应该使用哪种数据类型,应该根据实际需要灵活变动,不能而在某一种方式上钻牛角尖。
对于更多的开发人员而言,我们对自己的定位应该是语言的使用者,而非语言的研究者。所以编程实践中,如何采用合理、高效有用的方式才是我们真正需要考虑的东西,而非去一味追求刁钻的技巧技法,千万不要陷入“能力的怪圈”。
看到这里你是不是又学到了很多新知识呢~
如果你很想学编程,小编推荐我的C语言/C++编程学习基地【点击进入】!
都是学编程小伙伴们,带你入个门还是简简单单啦,一起学习,一起加油~
还有许多学习资料和视频,相信你会喜欢的!
涉及:游戏开发、常用软件开发、编程基础知识、课程设计、黑客等等......
【C/C++编程入门学习】同样是数据类型,链表对比数组?哪一个更香?的更多相关文章
- C、C++、Java到Python,编程入门学习什么语言好?
摘要:回顾编程语言几十年来的兴衰起伏,似乎也折射了整个信息产业的变迁消亡,想要在技术的洪流里激流勇进,找准并学精一两门编程语言更加显得至关重要. 最近,TIOBE更新了7月的编程语言榜单,常年霸榜的C ...
- OPENSSL编程入门学习
相关学习资料 http://bbs.pediy.com/showthread.php?t=92649 https://www.openssl.org https://www.google.com.hk ...
- cg语言学习&&阳春白雪GPU编程入门学习
虽然所知甚少,但康大的<GPU编程与Cg编程之阳春白雪下里巴人>确实带我入了shader的门,在里面我第一次清晰地知道了“语义”的意思,非常感谢. 入门shader,我觉得可以先读3本书: ...
- 【C/C++编程入门学习】C语言结构体硬核玩法分享,一切皆是数据!
前言 对于结构体的应用太多了,今天这篇文章我主要为大家总结平时关于结构体的一些独特硬核小技巧,对于结构体更多优秀的编程表现,如果你对结构体的基础知识还不具备的话得回头看一下专栏教程或者自己找本书籍学习 ...
- Lua编程入门-学习笔记2
第6章 深入函数 函数是一种“第一类值(First-Class Value)”,他们具有特定的词法域(lexical scoping) 将表达式“function(x) <body> en ...
- Lua编程入门-学习笔记1
第1章:起点 Chunks: 语句块 每个语句结尾的分号是可选的,如果同一行有多个语句最好使用分号分隔: dofile("lib1.lua") -- 执行lua文件 全局变量:局 ...
- opencv3 编程入门学习笔记(一): 基本函数介绍
滤波 blur (均值滤波) 均值滤波是典型的线性滤波算法, 主要方法为领域平均法(即用一片图像区域的各个像素的平均值来代替原图像中的各个像素值) 缺点: 不能很好的保护图像细节, 在图像去噪的同时也 ...
- 大牛整理最全Python零基础入门学习资料
大牛整理最全Python零基础入门学习资料 发布时间:『 2017-11-12 11:56 』 帖子类别:『人工智能』 阅读次数:3504 (本文『大牛整理最全Python零基础入门学习资料 ...
- C语言编程入门之--第四章C语言基本数据类型
导读:C语言程序中经常涉及一些数学计算,所以要熟悉其基本的数据类型.数据类型学习起来比较枯燥,不过结合之前的内存概念,以及本节的字节概念,相信数据类型也就不难理解了.本章从二进制的基本概念开始,然 ...
随机推荐
- 【新阁教育】基于Log4Net实现日志信息双向存储(含源码)
1.引言 在上位机开发中,日志记录是必不可少的,我们可以通过日志记录做日志分析及错误追踪.初学者会采用txt文本写入来实现日志保存,但是文本写入不是线程安全,当存在多个线程同时写入日志时,就会出现一些 ...
- JS红宝书笔记——第一章 JavaScript简介
1.JavaScript简史 Netscape公司决定开发一种客户端语言用来处理浏览器端简单的表单验证. Netscape公司派布兰登·艾奇(BrendanEich)为计划于1995年2月发布的Net ...
- win10家庭版启用远程桌面
此电脑右键属性->远程设置->允许远程协助连接这台计算机 勾选 下载RDP Wrapper 地址:https://github.com/stascorp/rdpwrap/releases ...
- .NetCore之接口缓存
1.问题:我们平时做开发的时候肯定都有用到缓存这个功能,一般写法是在需要的业务代码里读取缓存.判断是否存在.不存在则读取数据库再设置缓存这样一个步骤.但是如果我们有很多地方业务都有用到缓存,我们就需要 ...
- Docker实战(4):Docker错误记一笔
创建容器的时候报错WARNING: IPv4 forwarding is disabled. Networking will not work. 解决办法: vim /usr/lib/sysctl.d ...
- SM4密码算法matlab实现
%function C=SM4(X,K,M)%M为1时进行加密,M为0时进行解密操作,X为明文/密文输入,K为密钥输入X='0123456789abcdeffedcba9876543210';%X=' ...
- CRM、用户管理权限
CRM目录结构 from django.shortcuts import HttpResponse,render,redirect from django.conf.urls import url f ...
- java 常用类-String-1
一.字符串相关的类 1.1 String 的特性 String类:代表字符串.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. String是一个fin ...
- 容器云平台No.2~kubeadm创建高可用集群v1.19.1
通过kubernetes构建容器云平台第二篇,最近刚好官方发布了V1.19.0,本文就以最新版来介绍通过kubeadm安装高可用的kubernetes集群. 市面上安装k8s的工具很多,但是用于学习的 ...
- java学习从“菜鸟”到“放弃”
今天学到java的对象和类中, 由于刚考完c++面向对象与程序设计这门课,对于c++中的类掌握自认为不错,就开始过渡到java. 今天面对的问题,在书写一个类的时候,发现了许多与c++不同的地方. 比 ...