[数据结构] 数组与链表的优缺点和区别

概述

  数组 是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素。但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中。同样的道理,如果想删除一个元素,同样需要移动大量元素去填掉被移动的元素。如果应用需要快速访问数据,很少插入和删除元素,就应该用数组。

  链表 中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起,每个结点包括两个部分:一个是存储 数据元素 的 数据域,另一个是存储下一个结点地址的 指针。 
如果要访问链表中一个元素,需要从第一个元素开始,一直找到需要的元素位置。但是增加和删除一个元素对于链表数据结构就非常简单了,只要修改元素中的指针就可以了。如果应用需要经常插入和删除元素你就需要用链表

内存存储区别

  • 数组从中分配空间, 对于程序员方便快速,但自由度小。
  • 链表从中分配空间, 自由度大但申请管理比较麻烦. 

逻辑结构区别

  • 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费。 
  • 链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。(数组中插入、删除数据项时,需要移动其它数据项) 

总结

1、存取方式上,数组可以顺序存取或者随机存取,而链表只能顺序存取; 

2、存储位置上,数组逻辑上相邻的元素在物理存储位置上也相邻,而链表不一定; 

3、存储空间上,链表由于带有指针域,存储密度不如数组大; 

4、按序号查找时,数组可以随机访问,时间复杂度为O(1),而链表不支持随机访问,平均需要O(n); 

5、按值查找时,若数组无序,数组和链表时间复杂度均为O(1),但是当数组有序时,可以采用折半查找将时间复杂度降为O(logn); 

6、插入和删除时,数组平均需要移动n/2个元素,而链表只需修改指针即可; 

7、空间分配方面: 
数组在静态存储分配情形下,存储元素数量受限制,动态存储分配情形下,虽然存储空间可以扩充,但需要移动大量元素,导致操作效率降低,而且如果内存中没有更大块连续存储空间将导致分配失败; 
链表存储的节点空间只在需要的时候申请分配,只要内存中有空间就可以分配,操作比较灵活高效;

原文地址:http://blog.csdn.net/amazing7/article/details/51362071

时间: 2024-10-06 13:35:53

[数据结构] 数组与链表的优缺点和区别的相关文章

数据结构-用数组或链表依次存几个数,要求每次存之前判断要存的数是否和之前的数重复,如果重复就把原先的数删掉。

问题描述 用数组或链表依次存几个数,要求每次存之前判断要存的数是否和之前的数重复,如果重复就把原先的数删掉. 原先的数删掉之后要存的数也不要在存进数组或链表中了.依次存入12,2,6,15,6,2,15,8.最后遍历出来按升序排列.答案应该是8,12 解决方案 int[] data = { 12, 2, 6, 15, 6, 2, 15, 8 }; int[] result = data.GroupBy(x => x).Where(x => x.Count() == 1).Select(x =&

数组、链表、Hash(转)

     在程序中,存放指定的数据最常用的数据结构有两种:数组和链表.       数组和链表的区别:       1.数组是将元素在内存中连续存放.            链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起.       2.数组必须事先定义固定的长度,不能适应数据动态地增减的情况.当数据增加时,可能超出原先定义的元素个数:当数据减少时,造成内存浪费.            链表动态地进行存储分配,可以适应数据动态地增减的情况.       3.(静态)数组

数据结构模版----单链表实现方式总结

数据结构模版----单链表实现方式总结 前面我们提供了四种方式实现的单链表,有带头结点的不带头结点的,而单链表的结构体定义也有两种方式,那么这些实现方式,到底有什么区别呢,为什么会出现这么多种实现方式呢,下面我们就来细细体会 一 单链表结构体的实现区别 首先我们对比一下,单链表结构体 不同方式的单链表实现时,链表结点的实现是相同的,不同之处在于单链表结构体的实现上 单链表结构体的实现 [cpp] view plain copy print? typedef int ElemType;      

【数据结构2】链表

1单链表 1结点定义 2头插法建立单链表 3尾插法建立单链表 4按序号查找表结点 5按值查找表结点 6插入结点操作 7删除结点操作 8合并有序链表 2循环双链表 1结点定义 2插入和删除操作 3循环单链表 4带尾指针的循环单链表 5静态链表 由于顺序表的插入和删除操作需要移动大量元素,影响了效率.链式存储不要求逻辑上相邻的两个元素在物理位置上也相邻,而是通过"链"建立起数据元素的逻辑关系.因此,在链表的插入和删除不需要移动元素,只需修改指针. 链式存储的线性表称为链表.其中每个结点(N

c语言-java的二维数组和C语言二维数组的储存结构有什么区别?

问题描述 java的二维数组和C语言二维数组的储存结构有什么区别? java的二维数组和C语言二维数组的储存结构有什么区别?,数据结构有什么区别吗?有人说java的数组在内存中存储不是连续的,, 解决方案 java二维数组的存储在内存中不一定连续.二维数组是一维的一维,也就是树形结构. 解决方案二: 个人认为是连续的,要支持随机访问,当然如果内存真的不是连续的,那就是vm的事情了 解决方案三: C语言是连续的,Java应该也是连续的吧,这个问题还真没深究过.

javascript数据结构之双链表插入排序实例详解_javascript技巧

本文实例讲述了javascript数据结构之双链表插入排序实现方法.分享给大家供大家参考,具体如下: 数组存储前提下,插入排序算法,在最坏情况下,前面的元素需要不断向后移,以便在插入点留出空位,让目标元素插入. 换成链表时,显然无需做这种大量移动,根据每个节点的前驱节点"指针",向前找到插入点后,直接把目标值从原链表上摘下,然后在插入点把链表断成二截,然后跟目标点重新接起来即可. <!doctype html> <html> <head> <t

c++用(void *)和直接用*对数组名取地址有什么区别

问题描述 c++用(void *)和直接用*对数组名取地址有什么区别 char ch[5]="asdf"; cout<<(void * )ch; cout<<* ch; 编译输出是一样的 有什么区别? 解决方案 就你这个例子来说,没有什么区别.但是对于结构体等复杂类型,区别就大了,void *得到的指针,如果你对它相加,可能和你用struct的指针相加得到的地址完全不同. 指针的类型决定了一个数据单位的大小. 解决方案二: C++拾遗之对数组名取地址对数组名取地

想请教一下方法中传数组和传可变参数的区别

问题描述 想请教一下方法中传数组和传可变参数的区别 public int Add(int n1,int n2) { return n1+n2; } 想请教一下各位大神 这个方法中参数个数不固定的话 可以往里面传一个int类型的数组 也可以传一个params可变参数数组 想请教这两种方法有什么区别 解决方案 可变长参数没有限定参数的个数 数组则是限定了个数 解决方案二: 可变参数,也是数值访问形式,不过是字符串 解决方案三: 传可变参数可以多个参数,比较灵活 数组是定死的

c语言-C语言 数组问题 这俩有什么区别

问题描述 C语言 数组问题 这俩有什么区别 int (*a)[10]; 与int a [10]的区别两者的return a;分别返回的是什么还有两者的元素怎么引用 解决方案 这两者很不同. int a[10];这里的a是一个常量,表示数组的首地址.数组存储的是int型数据. int (*a)[10]; 这里的a是一个指针变量,指向一个数组,数组存储的是10个int型数据. 解决方案二: 一个是指针,一个是数组,用sizeof求值,以及free的时候都是不同的. 解决方案三: int (*a)[1