首先定义一个接口,定义线性表的各种操作。
internal interface ILinearList<T>
{
/// <summary>
/// 索引器
/// </summary>
/// <param name="index">索引</param>
/// <returns></returns>
T this[int index] { get; set; }
/// <summary>
/// 数组长度
/// </summary>
int Length { get; }
/// <summary>
/// 数组是否为空
/// </summary>
/// <returns></returns>
bool IsEmpty();
/// <summary>
///清空表
/// </summary>
void Clear();
/// <summary>
///通过索引获取数据元素
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
T GetItem(int index);
/// <summary>
/// 返回数据元素的索引
/// </summary>
/// <param name="t"></param>
/// <returns></returns>
int LocateItem(T t);
/// <summary>
/// 将数据元素插入到指定位置
/// </summary>
/// <param name="item"></param>
/// <param name="index"></param>
void Insert(T item, int index);
/// <summary>
/// 在数组末尾添加元素
/// </summary>
/// <param name="item"></param>
void Append(T item);
/// <summary>
/// 删除指定索引的元素
/// </summary>
/// <param name="index"></param>
void Delete(int index);
}
后面我们实现这个接口。
internal class SequentialList<T> : ILinearList<T>
{
private T[] data;
private int length;
private int maxSize;
public int MaxSize
{
get { return maxSize; }
set { maxSize = value; }
}
public SequentialList(int size)
{
data = new T[size];
maxSize = size;
length = 0;
}
public int Length => length;
public T this[int index]
{
get
{
if (index > length - 1)
{
throw new Exception("Index out of range");
}
return data[index];
}
set
{
if (index > length - 1)
{
throw new Exception("Index out of range");
}
data[index] = value;
}
}
public void Append(T item)
{
if (IsFull())
{
throw new Exception("List is full");
}
length++;
data[length - 1] = item;
}
public bool IsFull()
{
return length >= maxSize;
}
public void Clear()
{
length = 0;
}
public void Delete(int index)
{
if (IsEmpty())
{
throw new Exception("List is empty");
}
if (index < 0 || index > length - 1)
{
throw new Exception("Index out of range");
}
length--;
for (int i = index; i < length; i++)
{
data[i] = data[i + 1];
}
}
public T GetItem(int index)
{
if (IsEmpty())
{
throw new Exception("List is empty");
}
if (index < 0 || index > length - 1)
{
throw new Exception("Index out of range");
}
return data[index];
}
public void Insert(T item, int index)
{
if (IsFull())
{
throw new Exception("List is full");
}
if (index < 0 || index > length - 1)
{
throw new Exception("Index out of range");
}
length++;
for (int i = length-1; i > index; i--)
{
data[i] = data[i - 1];
}
data[index] = item;
}
public bool IsEmpty()
{
return length == 0;
}
public int LocateItem(T value)
{
if (value == null)
{
return -1;
}
for (int i = 0; i < data.Length; i++)
{
if (value.Equals(data[i]))
{
return i;
}
}
return -1;
}
}
最后看下如何使用我们定义的线性表。
//初始化线性表,开辟空间
ILinearList<int> list = new SequentialList<int>(10);
//往线性表尾添加数据,超过定义长度会抛异常
for (int i = 8; i < 18; i++)
{
list.Append(i);
}
string s = "线性表元素:";
for (int i = 0; i < list.Length; i++)
{
s+= " "+list[i];
}
Console.WriteLine(s);
//查找线性表数据
int r = list.GetItem(5);
Console.WriteLine($"线性表索引为5的元素:{r}");
s = "删除索引为5的元素后:";
//删除数据
list.Delete(5);
for (int i = 0; i < list.Length; i++)
{
s += " " + list[i];
}
Console.WriteLine(s);
s = "在索引为5的元素位置插入数据后:";
//插入数据
list.Insert(77, 5);
for (int i = 0; i < list.Length; i++)
{
s += " " + list[i];
}
Console.WriteLine(s);
运行结果如下: