赞
踩
数组是将元素在内存中连续存放,由于每个元素占用内存 相同,可以通过下标迅速访问数组中任何元素。
链表恰好相反,链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起。比如:上一个元素有个指针指到下一个元素,以此类推,直到最后 一个元素。
数组如果应用需要快速访问数据,通过下标元素访问。
(因为数组申请的内存是一段连续的内存地址,由于所申请的内存地址是连续的,我们只需要知道第一个内存地址和数组空间,就可以推断出查找下标的内存地址,即所存放的元素)
链表查找效率低,只能重头开始依次遍历寻找。
如果要在数组中增加一个元素,需要移动大量元素,那么这个元素后的所有元素的内存地址都要往后(前)移动(数组的内存地址是连续的),对最后一个元素插入(或删除)时才比较快,然后将要增加的元素放在其中。同样的道理,如果想删除一个元素,同样需要移动大量元素去填掉被移动的元素。
如果要访问链表中一个元素,需要从第一个元素开始,一直找到需要的元素位置。但是增加和删除一个元素对于链表数据结构就非常简单了,只要修改元 素中的指针(包括指针指向,节点值)就可以了。如果应用需要经常插入和删除元素你就需要用链表数据结构了。
数组大小固定,不适合动态存储,定义数组时所占用的空间大小都是固定的,如果存储满了,无法扩展,只能新建一个更大空间的数组。
链表的扩展性较好,大小可变。
1)从整体上看:
数组处理一组数据类型相同的数据, 但不允许动态定义数组的大小,即在使用数组之前必须确定数组的大小。只能将数组定义成足够 大小,这样数组中有些空间可能不被使用,从而造成内存空间的浪费。
链表是一种常见的数据组织形式,它采用动态分配内存的形式实现。需要时可以用new分配 内存空间,不需要时用delete将已分配的空间释放,不会造成内存空间的浪费。
2)从逻辑上看
数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费。
链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。(数组中插入、删除数据项时,需要移动其它数据项)
3)从内存上看
(静态)数组从栈中分配空间, 对于程序员方便快速,但自由度小。
链表从堆中分配空间, 自由度大但申请管理比较麻烦.
数组在内存中连续存储,而链表是不连续的; 数组静态分配内存,链表动态分配内存; 数组元素在栈区,链表元素在堆区;
数组查找元素(利用下标)时间复杂度为O(1),链表查找元素(按照顺序)时间复杂度O(n); 数组插入或删除元素(需要移动元素)时间复杂度O(n),链表移动或者删除元素(直接修改指针)的时间复杂度O(1)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。