数组和链表的比较

内存:

数组是将元素在内存中连续存放,由于每个元素占用内存 相同,可以通过下标迅速访问数组中任何元素。

链表恰好相反,链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起。比如:上一个元素有个指针指到下一个元素,以此类推,直到最后 一个元素。

访问元素:

数组如果应用需要快速访问数据,通过下标元素访问。

(因为数组申请的内存是一段连续的内存地址,由于所申请的内存地址是连续的,我们只需要知道第一个内存地址和数组空间,就可以推断出查找下标的内存地址,即所存放的元素)

链表查找效率低,只能重头开始依次遍历寻找。

增加和删除元素:

如果要在数组中增加一个元素,需要移动大量元素,那么这个元素后的所有元素的内存地址都要往后(前)移动(数组的内存地址是连续的),对最后一个元素插入(或删除)时才比较快,然后将要增加的元素放在其中。同样的道理,如果想删除一个元素,同样需要移动大量元素去填掉被移动的元素。

如果要访问链表中一个元素,需要从第一个元素开始,一直找到需要的元素位置。但是增加和删除一个元素对于链表数据结构就非常简单了,只要修改元 素中的指针(包括指针指向,节点值)就可以了。如果应用需要经常插入和删除元素你就需要用链表数据结构了。 

拓展性:

数组大小固定,不适合动态存储,定义数组时所占用的空间大小都是固定的,如果存储满了,无法扩展,只能新建一个更大空间的数组。

链表的扩展性较好,大小可变。

在C++语言中:

1)从整体上看:

数组处理一组数据类型相同的数据, 但不允许动态定义数组的大小,即在使用数组之前必须确定数组的大小。只能将数组定义成足够 大小,这样数组中有些空间可能不被使用,从而造成内存空间的浪费。

链表是一种常见的数据组织形式,它采用动态分配内存的形式实现。需要时可以用new分配 内存空间,不需要时用delete将已分配的空间释放,不会造成内存空间的浪费。

2)从逻辑上看

数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费。

链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。(数组中插入、删除数据项时,需要移动其它数据项)

3)从内存上看  

(静态)数组从栈中分配空间, 对于程序员方便快速,但自由度小。

链表从堆中分配空间, 自由度大但申请管理比较麻烦. 

综上所述,大体上为:

数组在内存中连续存储,而链表是不连续的; 数组静态分配内存,链表动态分配内存; 数组元素在栈区,链表元素在堆区; 
数组查找元素(利用下标)时间复杂度为O(1),链表查找元素(按照顺序)时间复杂度O(n); 数组插入或删除元素(需要移动元素)时间复杂度O(n),链表移动或者删除元素(直接修改指针)的时间复杂度O(1)。

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值