初識線性表和抽象數據類型
線性表
線性表是什麼,簡單來說線性表就如同生活中的排隊一樣,具有線一樣性質的數據結構.線性表有0個(當數據元素爲0時,稱該線性表爲空表)或者多個數據元素組成
- 線性表有以下幾個特點
- 線性表是一個序列,即各數據元素之間有一定的前後關係
- 若線性表不爲空表,則第一個元素無前驅,最後一個元素無後繼,其他元素有且只有一個前驅或者後繼
- 線性表中數據元素是有限的,因爲無論計算計多強大,發展到多先進的程度,計算機能夠處理的數據永遠不可能是無限的
前驅和後繼(數學語言描述)
若將線性表記爲a1.a2,…ai-1,ai,ai+1,…,an,則表中ai-1領先於ai,ai領先於ai+1,則稱ai-1是ai的直接前驅元素,ai+1是ai的直接後繼元素
可以看出,區別於很多計算機高級語言,線性表的序列是從1開始的,也因此,我們將線性表的元素個數n定義爲線性表的長度。
上面這個圖中可以看出總經理下分了別的職位,而總監下又分了別的職位,從線性表的特點:若線性表不爲空表,則第一個元素無前驅,最後一個元素無後繼,其他元素有且只有一個前驅或者後繼,由於該圖中一個數據元素有多個後繼,所以我們可以判斷該表不是線性表。
抽象數據類型
數據類型
數據類型[^1]指一組性質相同的值得集合以及定義在此集合上的一些操作的總稱
- 在C語言中,數據類型按照取值的不同,可以分爲
- 原子類型:不可再分解的基本類型,比如注1中的幾種類型
- 結構類型:若干個類型組合而成,可以再分解的,比如整形數組(若干個整型數據組成)、結構體…
[^1]比如編程語言中的整形,浮點型,字符型
抽象
什麼是抽象?抽象就是抽取出事物具有的普遍性的本質,它要求抽出問題的特徵而忽略非本質的細節(對具體事務的一個概括),抽象是一種思考問題的方式,它隱藏了繁雜的細節。
比如,髒活累活交給男人來幹,男人就是抽象,它不具體指是哪一個人。
抽象數據類型
對已有的數據類型進行抽象,就有了抽象數據類型(Abstract Data Type,ADT),指一個數學模型及定義在該模型上的一組操作。
抽象數據類型的定義僅僅取決於它的一組邏輯特性,與其在計算機內部如何表示無關,例如1+1=2,在不同CPU的處理可能不一樣,由於其數學特性相同,所以在計算機編程者眼中,它們相同。
“抽象”意義在於數學類型上的數學抽象特性。抽象數據類型不僅指已經定義並實現的數據類型,還可以是計算機變成這自己定義的數據類型,例如以後要學習的線性表。
抽象數據類型的標準格式
ADT (抽象數據類型名)
Data
數據元素之間邏輯關係的定義
Operation
操作
endADT
線性表的抽象數據類型定義
ADT線性表(List)
Data
線性表數據對象集合爲{a~1~.a~2~,...a~i-1~,a~i~,a~i+1~,...,a~n~}
並且每個元素類型均爲DataType,
除a~1~外,每個元素有且只有一個直接前驅元素,
除a~n~外,每個元素有且只有一個直接後繼元素
元素之間關係:一一對應
Operation
InitList(*L); //初始化,建立一個空的線性表L
ListEmpty(L); //判斷L是否爲空表,爲空,返回true,否則返回false
ClearList(*L); //清空線性表L
GetElem(L,i,*e); //將線性表L第i個元素返回給e
locateElem(L,e); //在線性表L中查找查找與給定值e相等的元素,若查找成功,返回該元素在表中序號,表示成功,否則返回0表示失敗
ListInsert(*L,i,e); //在線性表L中第i個位置前插入新元素e
ListDelete(*L,i,*e); //刪除線性L表中第i個元素,並且用e返回其值
ListLength(L); //返回線性表的元素個數
endADT
有了上面的定義,我們就可以方便的實現一些操作,例如下面的求兩表並集(A=A∪B):
/*要實現兩表並集,只需要遍歷一表每一個元素,而後判斷另一表是否有該元素,若有,忽略,沒有插入*/
List *unionL(List *La,List Lb)
{
int lengtha=ListLength(*La); //獲得La的長度
int lengthb=Listlength(Lb); //獲得Lb的長度
ElemType *e; //接收表Lb的值
/*表Lb爲空表,直接返回表La*/
if(lengthb==0)
{
return La;
}
else
{
for(int i=1;i<=lengthb;i++) //遍歷Lb
{
GetElem(Lb,i,*e); //將Lb第i個元素賦值給e
if(!(locateElem(*La,e))) //判斷La中是否有e,若沒有在表a末尾插入e
{
ListInsert(*La,(lengtha+1)++,*e);
}
}
}
return La;
}
可見,定義了一個抽象數據類型,將其封裝之後,我們將能夠更方便快捷的解決一些實際問題