所有的鏈表都應該有一下功能:
(1)獲取鏈表長度
(2)清楚鏈表全部項
(3)判斷鏈表是否為空
(4)判斷鏈表是否已滿
(5)在鏈表末尾添加新項
(6)在鏈表指定位置插入新項
(7)在鏈表指定位置刪除項目
(8)根據輸入項的序號返回鏈表項
(9)根據輸入列表項的值返回該項的序號
在這裡定義一個借口,約束所有的鏈表類都必須實現該借口,列表代碼如下:
interface IListFunction<T>
{
int GetLength();
void Clear();
bool IsEmpty();
bool IsFull();
void Append(T item);
void Insert(T item, int index);
void Delete(int index);
T GetItem(int index);
int Locate(T value);
}
順序鏈表實現代碼如下:
public class SequenceList<T> : IListFunction<T>
{
private int max;
private int last;
private T[] data;
public SequenceList(int max)
{
data = new T[max];
this.max = max;
last = -1;
}
/// <summary>
/// 實現索引器
/// </summary>
/// <param name="i"></param>
/// <returns></returns>
public T this[int i]
{
get { return data[i]; }
set { data[i] = value; }
}
/// <summary>
/// 獲取順序表長度
/// </summary>
/// <returns></returns>
public int GetLength()
{
return last + 1;
}
/// <summary>
/// 這裡很奇怪,單純只把list設置為-1可以嗎?
/// 把list設置為-1,在線性表裡面存儲的數據並沒有清理掉,起始就是線性表裡面的數據無法訪問
/// 但是線性表裡面的數據還是存在的
/// </summary>
public void Clear()
{
last = -1;
}
/// <summary>
/// 判斷順序表是否為空
/// </summary>
/// <returns></returns>
public bool IsEmpty()
{
if (last == -1)
return true;
else
return false;
}
/// <summary>
/// 判斷順序表是否已滿
/// </summary>
/// <returns></returns>
public bool IsFull()
{
if (last == max - 1)
return true;
else
return false;
}
/// <summary>
/// 在順序表末尾插入數據
/// </summary>
/// <param name="item"></param>
public void Append(T item)
{
if (IsFull())
throw new Exception("超出索引最大值");
data[++last] = item;
}
/// <summary>
/// 向順序表指定位置插入新值
/// </summary>
/// <param name="item"></param>
/// <param name="index"></param>
public void Insert(T item, int index)
{
if (IsFull())
throw new Exception("鏈表已滿,無法插入插入數據");
if (index < 0 || index > last + 2)
throw new Exception("插入位置小於零或超出鏈表最大位置");
if (index == last + 1)
{
data[index] = item;
}
else
{
for (int i = last + 1; i > index; i--)
{
data[i] = data[i - 1];
}
data[index] = item;
}
++last;
if (AddItem != null)
{
ItemArgs e = new ItemArgs(index, item);
AddItem(this, e);
}
}
/// <summary>
/// 刪除順序表指定位置的值
/// </summary>
/// <param name="index"></param>
public void Delete(int index)
{
if (index < 0 || index > last + 1)
throw new Exception("需要刪除項的索引超出界限");
if (IsEmpty())
throw new Exception("數據表內沒有任何項,無法刪除");
if (index == max - 1)
last = max - 2;
else
{
for (int i = index; i < last; i++)
{
data[i] = data[i + 1];
}
--last;
}
if (AddItem != null)
{
ItemArgs e = new ItemArgs(index);
AddItem(this, e);
}
}
/// <summary>
/// 根據順序表位置輸入值
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public T GetItem(int index)
{
if (index < 0 || index > last)
throw new Exception("無法獲取,索引超出界限");
return data[index];
}
/// <summary>
/// 根據值查找該值在順序表中的位置
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public int Locate(T value)
{
int resault = -1;
for (int i = 0; i <= last; i++)
{
if (data[i].Equals(value))
{
resault = i;
break;
}
}
return resault;
}
}