线性表(Linear List)是具有相同特性的数据元素的一个有限序列。 该序列中所含元素的个数称之为线性表的长度。线性表中元素在位置上是有序的。顺序表和链表是线性表的两种重要形式。
2 线性表的顺序存储结构-----顺序表
顺序表特点 1 容量固定 2 访问速度快 (排序后)
在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 是一种可排序的顺序表,它使用二分查找法
(大多数情况下,最快的排序算法)来插入和查找数据,性能优越。
3 线性表的链式存储结构 ---链表
在无序数组中查找数据项是很慢的,需要遍历数组每个元素,有顺序会快些,但是插入,删除操作还是很慢的,因为需要为增加,移除空间(arryalist), 当发现使用链表比较慢的时候,可以考虑使用链表 。链表可以用于几乎所欲数组的情况,除非随机存取访问列表内的数据项。
1 单向链表
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;
}
}