线性表(Linear List)是具有相同特性的数据元素的一个有限序列。 该序列中所含元素的个数称之为线性表的长度。线性表中元素在位置上是有序的。顺序表和链表是线性表的两种重要形式。

 

线性表的顺序存储结构-----顺序表

 顺序表特点 容量固定 访问速度快 (排序后)

 在c# 中顺序表的直接表现形式是数组 ,数组是引用类型,数组的长度(托管堆分配一定长度内存空间,引用类型初始值是null,值类型如int 0)一旦确定就不能更改,这使得数组没有添加,删除元素的操作。。任何对数组的添加,删除操作都是逻辑意义上的。

数组的特点是访问速度快,但是缺点明显,进行添加删除是不可以的,如果要动态改变集合的大小,就要用system.collections.arraylist .,它使用内存成片区域的复制来实现,成本非常低。添加插入时候空间满通过空间加倍的方法, Array.copy(Items,temarrya,0,size);// items 就有数组,temparray ,临时数组,起始索引,新空间大小长度 .

插入时候插入点后面的所有元素向后移动一位 arrya.copy(item,index, items,index+1,size-index) ; 在可以预见arraylist 的大小的时候比如 Arraylist arr =new  ArrayList(100);可以在一定成都上避免重复创建和数据迁移,提高性能和减少内存垃圾回收压力。 

数组和Arraylist 的本质区别是前者是类型安全的,后者是类型不安全的 ,ArrayList 为了兼容所有版本使用了 object  数组。 程序带来隐患,同时值类型还会产生拆箱和装箱操作,降低了程序的性能。 System.collections.Generic 命名空间下的List<T>取代了Arraylist ..完美的解决了这个问。 C# 集合中的SortedList  是一种可排序的顺序表,它使用二分查找法

(大多数情况下,最快的排序算法)来插入和查找数据,性能优越。

线性表的链式存储结构 ---链表 

 在无序数组中查找数据项是很慢的,需要遍历数组每个元素,有顺序会快些,但是插入,删除操作还是很慢的,因为需要为增加,移除空间(arryalist当发现使用链表比较慢的时候,可以考虑使用链表 。链表可以用于几乎所欲数组的情况,除非随机存取访问列表内的数据项。

单向链表

 public   class LinkedList

 

   {

      protected Node header;

      public LinkedList()

      {

          header = new Node();

      }

      public Node Find(object item)

      {

          Node Current = header;

          while (Current.Element!=item)

          {

              Current = Current.Link;

          }

 

          return Current;

      }

      public void Insert(object newItem,object after)

      {

          Node newNode= new Node(newItem);

          Node Current = Find(after);

          newNode.Link = Current.Link;

          Current.Link = newNode; 

      }

      public Node FindPrivious(Object n)

      {

          Node Current = header;

          while((Current.Link!=null)&&(Current.Link.Element!=null))

          {

              Current = Current.Link;

          }

          return header;

      }

      public void Remove(Object n)

      {

          Node Current = FindPrivious(n);

          if (Current.Link != null)

              Current.Link = Current.Link.Link;

 

      }

     

   }

  public class Node

  {

      public object Element;

      public Node Link;

      public Node()

      {

          Element = null; 

          Link = null;

      }

      public Node(Object theElement)

      {

          Element = theElement;

          Link = null;

      }

 

  }

 

2   双向链表 

   双向链表使得反向遍历,添加移除结点容易,system.collection.ArrayList 使用了循环链表 ,System.Collections.Generic  中LinkedListNode ,LinkedList  实现了双向链表

 

 public  class DoubleLinkedList

   {

       protected Node header;

       public Node Find(object item)

       {

           Node Current = header;

           while (Current.Element != item)

           {

               Current = Current.FLink;

           }

 

           return Current;

       }

       public void Insert(Object newItem,Object after)

       {

           Node Current = Find(newItem);

           Node newNode = new Node(newItem);

           newNode.FLink = Current.FLink;

           newNode.BLink = Current;

           Current.FLink = newNode;

       }

       public void Remove(Object n)

       {

           Node Current = Find(n);

           if (Current.FLink != null)

           {

               Current.BLink.FLink = Current.FLink;

               Current.FLink.BLink = Current.BLink;

               Current.BLink = null;

               Current.FLink = null;

           }

         

       }

    }

   public class Node

   {

       public object Element;

       public Node FLink;// 下一个结点

       public Node BLink;

       public Node()

       {

           Element = null;

           FLink = null;

           BLink = null;

       }

       public Node(Object theElement)

       {

           Element = theElement;

           FLink = null;

           BLink = null;

       } 

 

   }

 

一个.net framework 中 提供的 LinkedListNode ,LinkedList   Demo

 public void Test()

        {

            LinkedListNode<string> node = new LinkedListNode<string>("老李");

            LinkedListNode<string> node1 = new LinkedListNode<string>("老马师傅");

            LinkedList<string> names = new LinkedList<string>();

            names.AddFirst(node);

            names.AddAfter(node, node1);

            LinkedListNode<string> anode = names.First;

            while (anode != null)

            {

                anode = anode.Next;

            }

 

            anode = names.Find("老李");

            while (anode != names.Last)

            {

                anode = anode.Next;

            }

        }