順序表在計算機內(nèi)存中以數(shù)組的形式保存的線性表,線性表的順序存儲是指用一組地址連續(xù)的存儲單元,依次存儲線性表中的各個元素、使得線性表中再邏輯結(jié)構上響鈴的數(shù)據(jù)元素存儲在相鄰的物理存儲單元中,即通過數(shù)據(jù)元素物理存儲的相鄰關系來反映數(shù)據(jù)元素之間邏輯上的相鄰關系房维。
**線性表的特征:**
1.第一個數(shù)據(jù)元素沒有前驅(qū),這個數(shù)據(jù)元素被稱為頭結(jié)點抬纸。
2.最后一個數(shù)據(jù)元素沒有后繼咙俩,這個數(shù)據(jù)元素被稱為尾結(jié)點。
3.除了第一個和最后一個數(shù)據(jù)元素外湿故,其他數(shù)據(jù)元素有且僅有一個前驅(qū)和一個后繼阿趁。
順序表代碼實現(xiàn):
/// <summary>
/// 順序表
/// </summary>
/// <typeparam name="T"></typeparam>
public class SequenceList<T> : IEnumerable
{
//存儲元素的數(shù)據(jù)
private T[] eles;
//記錄當前順序表中的元素個數(shù)
private int N;
public SequenceList(int capacity)
{
this.eles = new T[capacity];
this.N = 0;
}
public void Clear()
{
this.N = 0;
}
public bool IsEmpty()
{
return N == 0;
}
public int Length()
{
return N;
}
public T Get(int i)
{
return this.eles[i];
}
public void insert(T t)
{
this.eles[N++] = t;
}
public void insert(int i, T t)
{
for (int index = N; index > i; index--)
{
eles[index] = eles[index - 1];
}
eles[i] = t;
N++;
}
public T Remove(int i)
{
T current = eles[i];
for (int index = i; index < N - 1; index++)
{
eles[index] = eles[index - 1];
}
N--;
return current;
}
public int indexOf(T t)
{
for (int i = 0; i < N; i++)
{
if (Object.ReferenceEquals(eles[i], t))
{
return i;
}
}
return -1;
}
public IEnumerator GetEnumerator()
{
return new MyEnumerator(eles);
}
public class MyEnumerator : IEnumerator
{
T[] eles;
int idx = -1;
public MyEnumerator(T[] eles)
{
idx = 0;
this.eles = eles;
}
public object Current
{
get
{
if (idx == -1)
return new IndexOutOfRangeException();
return eles[idx];
}
}
public bool MoveNext()
{
idx++;
return eles.Length > idx;
}
public void Reset()
{
idx = -1;
}
}
}
總結(jié):由于順序表的底層由數(shù)組實現(xiàn),數(shù)組的長度是固定的坛猪,所以在操作的過程中涉及到了容器擴容操作脖阵。這樣會導致順序表在使用過程中的時間復雜度不是線性的,在某些需要擴容的結(jié)點處墅茉,耗時會突增命黔,尤其是元素越多呜呐,這個問題越明顯。