数据结构课程中的顺序表(Sequence List);C++中的向量(vector);C#中的List
在实现上的原理很类似。
即:能够动态调整的数组。可以应对事先不知道数据量大小的应用。
有兴趣的可以看微软官方 List 的源代码:
https://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs,9808f1f5ef16c436
一、List<T>所在库
using System.Collections.Generic; //List所在库
二、定义一个整型List
static void Main(string[] args)
{
List<int> L=new List<int>(16);//刚开始时申请16个空间,可以是其他数,视情况而定
}
三、在尾部插入数据
L.Add(6);
L.Add(7);
L.Add(8);
L.Add(1);
L.Add(2);
L.Add(3);
插入从前到后的数据为:6 7 8 1 2 3
注意:Add有多个重载函数,参数不同。
四、打印List中的数据
List可以像数组一样用下标引用元素。
static void print(List<int> L)
{
for (int i = 0; i < L.Count; i++)
{
Console.Write(L[i]); Console.Write(" ");
}
Console.Write("\n");
}
其中:L.Count表示List中的数据个数。
或者用foreach也可以:
static void Main(string[] args)
{
List<int> L;
L = new List<int>(64);
L.Add(1);
L.Add(2);
L.Add(9);
L.Add(7);
foreach(int x in L)
{
Console.WriteLine(x);
}
}
五、List中数据按照升序排序
L.Sort();
L.Sort((x, y) => -x.CompareTo(y));//降序
注意:因为本例是简单数据,所以可以这样。如果List中是结构体数据,则需要定义比较函数。
六、顺序查找
int index = L.IndexOf(8);//顺序查找,返回下标 。
七、折半查找
index = L.BinarySearch(3);//升序时,折半查找,若存在返回下标。否则返回负值。
八、元素倒置(逆转)
L.Reverse(); //
九、一个完整的程序
static void Main(string[] args)
{
List<int> L=new List<int>();
L.Add(6);
L.Add(7);
L.Add(8);
L.Add(1);
L.Add(2);
L.Add(3);
Console.WriteLine(L.Count);//输出L中数据的个数
Console.WriteLine(L.Capacity);//输出L所占空间的大小
L.Sort(); //升序排列
print(L);
index = L.BinarySearch(3);//升序时,折半查找
Console.WriteLine(index);
print(L);
index = L.IndexOf(8);//顺序查找,返回下标
Console.WriteLine(index);
L.Reverse();//逆转
print(L);
}
static void print(List<int> L)
{
for (int i = 0; i < L.Count; i++)
{
Console.Write(L[i]); Console.Write(" ");
}
Console.Write("\n");
}
十、List自动扩充空间的原理
比如初识时,List用A存储16个空间的首地址,
当不断插入数据,用完了了16个空间时,
重点来了,
申请一个新空间,大小是原来的二倍,比如32,
把原来的16个数据拷贝进新空间,让A指向新空间,释放掉老空间(系统自动完成),
把新来的数据插入新空间。
同理,当32个空间不足时,申请64个空间。