数组和列表之间的区别

时间:2010-08-15 09:46:27

标签: c

数组和列表有什么区别?

6 个答案:

答案 0 :(得分:6)

C中没有标准列表这样的东西。在C ++中有这样的东西,它被实现为double-linked list

主要区别在于数组具有随机访问 - 您可以在O(1)时间内访问数组的任何成员(即如果a是数组,{{1并且在编译时具有预设的大小。链接列表具有顺序访问权限 - 要访问元素,您必须循环遍历列表,直到找到所需的元素(即,如果a[4]是链接列表),才能到达{{1}的第5个元素你必须遍历元素0,1,2,3和4),并且可以动态增长和缩小大小。

答案 1 :(得分:5)

虽然在 list 本身 C 链接列表实现。

数组:随机访问,预定义大小。
链接列表:顺序访问,运行时大小。

其他语言,例如Python,可能同时包含listarray,其含义可能不同。

以下有用的评论:

您可以添加数组列表。列表内部是一个数组,在需要时加倍,当只有1/4满时减半。这使得O(1)用于添加,删除,获得(索引)摊销。 - lasseespeholt

Python的list不是链表。 Python listarray之间的区别是list可以存储任何内容,而数组只能存储基本类型(intfloat等)。 - KennyTM

答案 2 :(得分:5)

在C 中,数组是包含多个对象的连续存储的固定大小区域,一个接一个。这个数组是一个“对象”,意思是C赋予这个词 - 基本上只是一些代表某事的记忆。对象可以是int

您可以稍微区分数组对象和数组类型。通常人们使用分配有malloc的数组对象,并通过指向第一个元素的指针使用。但是C也有不同大小的数组的特定类型,也适用于可变长度数组,其大小在创建时设置。 VLA具有略微误导性的名称:在编译时它没有固定的意义上,大小只是“可变的”。它在对象的生命周期内无法改变。

因此,当我说数组是固定大小时,我的意思是一旦创建了数组,大小就不会改变,这包括VLA。有realloc,它逻辑上返回一个指向新数组的指针,该数组替换旧的数组,但有时会返回传入的相同地址,并且已经更改了数组的大小。 realloc对内存分配进行操作,而不是对数组进行操作。

这就是数组。 C编程语言没有定义任何称为列表的东西。无法真正比​​较定义明确的东西,未定义的东西;-)通常“列表”意味着linked list,但在某些情境或其他语言中,它意味着其他东西。

就此而言,在其他语言中,“数组”可能意味着其他的东西,虽然我不能立即想到一种语言,它意味着与C数组有很大不同。

如果你的问题与C无关,并且是一个与语言无关的数据结构问题,“数组和链表之间的区别是什么?”,那么它就是这个的重复:

Array versus linked-list

答案 3 :(得分:1)

  1. 对于数组,它有一个像我们写的固定大小, new int [100] 但是列表没有固定的大小......它可以继续下去

  2. 列表中的插入和删除比在数组中更容易 原因:我们可以简单地使用更改指针插入和删除链表但是对于数组插入和删除需要shiftRight和shiftLeft

  3. 链接列表使用虚拟头节点来避免插入空列表或从单元大小列表中删除最后一个节点的特殊情况;并且,它使用双链接允许在两个方向上迭代。当然,成本是保持虚拟节点所需的额外空间(最小成本),以及额外的先前链路以及每个节点的通常下一个链路(更加显着的成本)。 在数组中,我们可以借助其随机访问添加

  4. 在链接列表中,对尾节点的引用就是header.prev,它使我们能够在恒定时间内追加到列表中(无需迭代查找尾引用,或者必须保持单独的尾巴参考)。 但是在数组中,我们需要在插入之前重新调整数组的大小。

  5. 与Linked List不同,Array可以灵活地获得随机访问。

  6. 链接列表存在问题,

      

    它为我们正在使用的指针消耗额外的内存!

         

    O(n)的时间复杂度,而不是像数组

    中的O(1)      

    单链表反向遍历很困难,如果我们使用双链表,另一个指针意味着额外的内存存储

         

    堆限制也是如此!仅当堆中有可用空间时才分配内存。如果内存不足,则不会创建内存。

    数组有问题,

      

    存在内存浪费或短缺的可能性。

    希望这有帮助! :)

答案 4 :(得分:0)

链接数据结构通常不受欢迎的特性是,在内存高度分散的情况下,您可以使用它们,因为元素之间没有连续的内存保证。例如,您可以拥有100MB的可用空间,但只能说最长可用内存长度为10MB。在这种情况下,您只能创建一个大小为10MB的数组,但可能是一个可能更大的链表,因为您可以使用足够大的空闲内存以包含单个节点。

答案 5 :(得分:0)

数组只有类似的数据类型(即),它们本质上是同质的。我们只能有一个字符串,整数等数组,而且数组的大小也是预定义的。  但在 list 的情况下,我们可以有任何类型的元素。让它成为字符串整数或两者的组合。列表中也允许使用null或重复元素。列表的示例包括arraylist,linkedlist。在列表中,大小可以随时增长或缩小。