C#学习04-顺序表-向量-动态数组--List「T」-以简单数据类型为例

数据结构课程中的顺序表(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个空间。

猜你喜欢

转载自blog.csdn.net/weixin_43917370/article/details/107242238