数组和链表的区别

来源:互联网 发布:2017最火的网络电视剧 编辑:程序博客网 时间:2024/05/19 21:02
  • 数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素。但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中。同样的道理,如果想删除一个元素,同样需要移动大量元素去填掉被移动的元素。如果应用需要快速访问数据,很少或不插入和删除元素,就应该用数组。
  • 链表恰好相反,链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起。比如:上一个元素有个指针指到下一个元素,以此类推,直到最后一个元素。如果要访问链表中一个元素,需要从第一个元素开始,一直找到需要的元素位置。但是增加和删除一个元素对于链表数据结构就非常简单了,只要修改元素中的指针就可以了。如果应用需要经常插入和删除元素你就需要用链表数据结构了。

   *C++语言中可以用数组处理一组数据类型相同的数据,但不允许动态定义数组的大小,即在使用数组之前必须确定数组的大小。而在实际应用中,用户使用数组之前有时无法准确确定数组的大小,只能将数组定义成足够大小,这样数组中有些空间可能不被使用,从而造成内存空间的浪费。链表是一种常见的数据组织形式,它采用动态分配内存的形式实现。需要时可以用new分配内存空间,不需要时用delete将已分配的空间释放,不会造成内存空间的浪费。
  (1) 从逻辑结构角度来看
     a, 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费。
     b,链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。(数组中插入、删除数据项时,需要移动其它数据项)
  (2)从内存存储角度来看
     a,(静态)数组从栈中分配空间, 对于程序员方便快速,但自由度小。
     b, 链表从堆中分配空间, 自由度大但申请管理比较麻烦.

以下是c#动态数组部分:*********************************************************************************

C#中的数组是可以动态分配长度的,实现动态数组有以下几种途径,这里说的动态数组包括动态分配大小和动态增加数据.

先来看原始数组:
 int m = 5;
 int[] array = new int[m];
 array[0] = 2;
 label1.Text = array[0].ToString() + " + " + array.Length.ToString();
结果的输出自然是 2 + 5;
 
动态分配:
1:m++;
  array = new int[m];//相当于重新初始化,原来的值被冲掉了  
  label2.Text = array[0].ToString() + " + " + array.Length.ToString();
结果输出自然是 0 + 6;
2:m++;
  Array.Resize(ref array, m);//System.Array.Resize 这个泛型方法是重新创建 新设置大小的数组,用的是旧数组的元素初始化。
                         //随后以前的数组就废弃!也就是说并不是在原先的基础上扩容,而是新建了一个.
  label2.Text = array[0].ToString() + " + " + array.Length.ToString();
结果输出自然是 2 + 6;
3:再有就是通过ArrayList的方法
 
第1种方案适合能够事先能从某处读出来长度的情况;第2,3种方案最适合在事先不知道数据长度究竟有多少,只能来一个算一个的情况,个人感觉,这才是动态数组真正的用途,也就是能够随着数据的增加而自动扩容。
在这方面ArrayList毫无疑问是首选,能够真正实现这个功能.
ArrayList al = new ArrayList();
al.Add(
NewData);//单个添加
如果增加的是同一类型的数据,用Array.Resize()也是能够实现的:
if(产生了新数据)//增加个判断
{
    m++;//假设数组原来的长度是m
    Array.Resize(ref array,m);
    array[m] = NewData;
}
虽然有同样的效果,但本质上是有差异的.ArrayList是真正的在变长.而System.Array.Resize 这个泛型方法是重新创建 新设置大小的数组,用的是旧数组的元素初始化。随后以前的数组就废弃!也就是说并不是在原先的基础上扩容,而是新建了一个.但是无论如何在表面上看来确实实现了我们想要的功能.
delphi 里数组 var array :array of String;setlength(array,4);setlength(array,length(array)+1);和c#里的Array.Resize(ref array,m)是相同的。


0 0