自己實現(xiàn)一個List類利赋,深刻理解List類內(nèi)部是怎么運作的求厕。
實現(xiàn)一個線性表,需要實現(xiàn)什么方法债朵?
首先看下線性表的接口定義(也就是定義了線性表里面應(yīng)該有哪些方法):
public interface IListDS<T>//首先定義一個接口畸陡,作用域里都是要實現(xiàn)的方法、主要功能
{
int GetLength();//取得當(dāng)前數(shù)組(或添加元素)的長度
void Clear();//清空所有的數(shù)據(jù)
bool IsEmpty();//判斷線性表是否有數(shù)據(jù)
void Append(T item);//用來添加的架忌,相當(dāng)于void Add(T item);
void Insert(T item,int i);//刪除操作
T Delete(int i);//刪除操作
T GetElem(int i);//取表元吞彤,即根據(jù)索引去取得元素
T this[int index]{get;}//定義一個索引器,獲得元素
int Locate(T value);//按值查找叹放,即根據(jù)元素去得到這個索引
}
要實現(xiàn)上方的線性表饰恕,有很多的實現(xiàn)方式,存儲線性表時井仰,有很多的儲存方式埋嵌。
線性表的實現(xiàn)方式
線性表的實現(xiàn)方式有下面幾種:
順序表;
單鏈表:
雙向鏈表(單鏈表的擴(kuò)展)
循環(huán)鏈表(單鏈表的擴(kuò)展)
順序表的實現(xiàn)方式:
就是把數(shù)據(jù)元素按照順序連續(xù)的存儲到內(nèi)存當(dāng)中俱恶。這就是線性表的【順序存儲】(Sequence Storage)結(jié)構(gòu)雹嗦。
(Sequence就是順序的范舀,序列的意思)
線性表只要求數(shù)據(jù)元素是線性關(guān)系,但不對數(shù)據(jù)如何存儲有要求了罪,而順序表則是要求數(shù)據(jù)元素按照順序排序存放的線性表锭环。
順序表的特點:
表中相鄰的數(shù)據(jù)元素在內(nèi)存中存儲位置也相鄰。
下圖中泊藕,0~maxsize-1就是索引辅辩,方框就是數(shù)據(jù)元素占的內(nèi)存區(qū)域。
順序表的存儲:
C#語言中的數(shù)組娃圆,在內(nèi)存中占用的存儲空間玫锋,就是一組連續(xù)的存儲區(qū)域。因此讼呢,數(shù)組具有【任意存取】的特點撩鹿,所以,數(shù)組天生具有表示順序表的數(shù)據(jù)存儲區(qū)域的特性悦屏。
上圖舉例:因為元素存儲的地址是連續(xù)的三痰,且因為順序表存儲的是一樣的類型數(shù)據(jù)元素,所以每個占用的內(nèi)存大小也是一樣的窜管。
所以,只需要知道索引0號的位置(也就是【基地址】)稚机,就可以算出來每個元素的位置幕帆,這個位置指的是內(nèi)存的地址,有了內(nèi)存地址就可以訪問到這個元素赖条,進(jìn)行存取數(shù)據(jù)的操作失乾。
關(guān)于順序表的話,我們可以通過數(shù)組來進(jìn)行存取纬乍。
順序表的實現(xiàn):
public class SeqList<T>:IListDS<T>
{
//...
}
使用代碼來實現(xiàn):
namespace 定義線性表的接口
{
interface IListDS<T>//首先要定義一個接口碱茁,加個泛型<T>,第一個字母加個大寫I代表接口仿贬,因為系統(tǒng)已經(jīng)有一個IList接口纽竣,為避免重復(fù),加個DS代表數(shù)據(jù)結(jié)構(gòu)的意思茧泪。
{
//主要功能:
int GetLength();//得到長度的方法
void Clear();//清空數(shù)據(jù)的操作
bool IsEmpty();//判斷是否為空
void Add(T item);//添加操作蜓氨,添加的數(shù)據(jù)肯定是T類型的
void Insert(T item, int index);//插入操作,參數(shù)包括:插入的數(shù)據(jù)T item, 队伟,插入的位置int index
T Delete(int index);//根據(jù)索引位置刪除穴吹,刪除之后把這個元素返回,返回的元素就是刪除的元素嗜侮。
T this[int index] { get; }//通過索引器訪問元素港令,跟GetEle一樣的用途
T GetEle(int index);//根據(jù)索引得到元素
int Locate(T value);//根據(jù)值取得索
}
}
使用順序表實現(xiàn)這個接口
因為方法都沒被實現(xiàn)啥容,所以都拋出了異常。
namespace 定義線性表的接口
{
class SeqList<T>:IListDS<T>//解決方案里添加新的順序表類SeqList<T>顷霹,實現(xiàn)IList<T>接口
{
//作用域里這些方法默認(rèn)是沒有的咪惠,鼠標(biāo)框選IList后,鼠標(biāo)移動到IList下方空白處即出現(xiàn)標(biāo)志泼返,查看下拉列表選擇一個硝逢,即可自動補(bǔ)全下列方法。
public int GetLength()
{
throw new NotImplementedException();
}
public void Clear()
{
throw new NotImplementedException();
}
public bool IsEmpty()
{
throw new NotImplementedException();
}
public void Add(T item)
{
throw new NotImplementedException();
}
public void Insert(T item, int index)
{
throw new NotImplementedException();
}
public T Delete(int index)
{
throw new NotImplementedException();
}
public T this[int index]
{
get { throw new NotImplementedException(); }
}
public T GetEle(int index)
{
throw new NotImplementedException();
}
public int Locate(T value)
{
throw new NotImplementedException();
}
}
}