using System;
namespace DataStructures.Lists
{
public class SeqList<T> : IListDS<T> where T : IComparable<T>
{
#region Fields
T[] data; // 陣列儲存元素
int maxSize; // 最大容量
int last; // 最後一個元素索引
#endregion
#region Properties
public T this[uint index] { get => data[index]; set => data[index] = value; }
public int MaxSize { get => maxSize; set => maxSize = value; }
#endregion
#region Constructors
public SeqList() : this(20) { }
public SeqList(int size)
{
data = new T[size];
maxSize = size;
last = -1;
}
#endregion
#region Methods
public virtual bool IsFull => last == maxSize - 1;
public override string ToString()
{
for (int i = 0; i <= last; ++i) Console.WriteLine(data[i]);
return "OK";
}
public virtual int SeqSearch(T key)
{
Insert(key, 1); // 哨兵查找法
int i = 0;
for (i = last; !key.Equals(data[i]); --i) ;
return i;
}
#endregion
#region IListDS<T> Members
public virtual void Append(T item)
{
if (last == maxSize - 1) Console.WriteLine("List is full");
else data[++last] = item;
}
public virtual void Insert(T item, int index)
{
if (last == maxSize - 1) { Console.WriteLine("List is full"); return; }
if (index < 1 || index > last + 2) { Console.WriteLine("Position is error!"); return; }
if (index == last + 2) data[index - 1] = item; // 尾部插入
else
{
for (int i = last; i >= index - 1; --i) data[i + 1] = data[i]; // 後移
data[index - 1] = item;
++last;
}
}
public virtual T Delete(int index)
{
T result = default(T);
if (last == -1) { Console.WriteLine("List is empty"); return result; }
if (index < 1 || index > last + 1) { Console.WriteLine("Position is error!"); return result; }
if (index == last + 1) result = data[last--]; // 刪除尾部
else
{
result = data[index - 1];
for (int j = index; j <= last; ++j) data[j - 1] = data[j]; // 前移
--last;
}
return result;
}
public virtual T GetElement(int index)
{
T result = default(T);
if (last == -1 || index < 1 || index > last + 1)
{ Console.WriteLine("List is empty / Position error"); return result; }
return data[index - 1];
}
public virtual int Locate(T value)
{
if (last == -1) { Console.WriteLine("List is Empty"); return -1; }
int i = 0;
for (; i <= last; ++i) if (value.Equals(data[i])) break;
return i > last ? -1 : i;
}
public virtual void Update(T newItem, int index)
{
if (last == -1) Console.WriteLine("List is Empty");
else if (index < 1 || index > last + 1) Console.WriteLine("Position is error!");
else data[index - 1] = newItem;
}
public virtual void Replace(T newItem, T oldItem)
{
if (last == -1) { Console.WriteLine("List is Empty"); return; }
int i = 0;
for (; i <= last; ++i) if (oldItem.Equals(data[i])) data[i] = newItem;
if (i > last) Console.WriteLine("List have no oldItem");
}
#endregion
#region IDS<T> Members
public virtual int Count => last + 1;
public virtual void Clear() => last = -1;
public virtual bool IsEmpty => last == -1;
#endregion
}
}
剛完成,尚未測試。