一、定義:零個或多個數據元素的有限序列。
線性表元素的個數n(n>=0)定義為線性表的長度,當n=0時,稱為空表。
在較復雜的線性表中,一個數據元素可以由若干個數據項組成。
二、線性表的抽象數據類型
三、線性表的順序存儲結構
1、順序存儲定義:線性表的順序存儲結構,指的是用一段地址連續的存儲單元依次存儲線性表的數據元素。
2、順序存儲方式
描述順序存儲結構需要三個屬性:
a、存儲空間的起始位置:數組data,它的存儲位置就是存儲空間的存儲位置。
b、線性表的最大存儲容量:數組長度MaxSize.
c、線性表的當前長度:length。
3、數據長度與線性表長度的區別
a、數組長度:數組的長度是存放線性表的存儲空間的長度存儲分配后這個量是一般是不變的。
b、線性表長度:線性表長度是線性表中數據元素的個數,隨着線性表插入和刪除操作的進行,這個量是變化的。
在任意時刻,線性表的長度應該小於等於數組的長度。
4、地址計算方法
存儲器中的每個存儲單元都有自己的編號,這個編號稱為地址。
假設占用的是c個存儲單元,那么線性表中第i+1個數據元素的存儲位置和第i個數據元素的存儲關系滿足下列關系(LOC表示獲得存儲位置的函數)。
所以對於第i個數據元素a1的存儲位置可以由a1推算得出:
四、順序存儲結構的插入與刪除
1、獲得元素操作:使用GetElem操作。
2、插入操作
插入算法的思路:
a、如果插入位置不合理,拋出異常。
b、如果線性表長度大於等於數組長度,則拋出異常或動態增加容量。
c、從最后一個元素開始向前遍歷到第i個元素,分別將他們都向后移動一個位置。
d、將要插入的元素填入位置i處。
e、表長加1.
3、刪除操作
刪除算法的思路:
a、如果刪除位置不合理,拋出異常。
b、取出刪除元素。
c、從刪除元素位置開始遍歷到最后一個元素位置,分別將他們都向前移動一個位置。
d、表長減1。
4、線性表順序存儲結構的優缺點
優點:
a、無須為表示表中元素之間的邏輯關系而增加額外的存儲空間。
b、可以快速地存取表中任一位置的元素。
缺點:
a、插入和刪除操作需要移動大量元素。
b、當線性表長度變化較大時,難以確定存儲空間的容量。
c、造成存儲空間的“碎片”。
五、線性表的鏈式存儲結構
1、線性表鏈式存儲結構定義
為了表示每個數據元素a與其直接后繼數據元素之間的邏輯關系,對數據元素a來說,除了存儲其本身的信息之外,還需存儲一個指示其后繼的信息(即直接后繼的存儲位置)。我們把存儲數據元素信息的域稱為數據域,把存儲直接后繼位置的域稱為指針域。指針域中存儲的信息稱作指針或鏈。這兩部分信息組成數據元素a的存儲映像,稱為結點。
n個結點(a的存儲映像)鏈結成一個鏈表,即為線性表的鏈式存儲結構,因為此鏈表的每個結點中只包含一個指針域,所以叫做單鏈表
把鏈表中的第一個結點的存儲位置叫做頭指針。規定,線性鏈表的最后一個結點指針為“空”。
有時,為了方便對鏈表進行操作,會在單鏈表的第一個結點前附設一個結點,稱為頭結點。頭結點的數據域可以不存儲任何信息。
2、頭指針與頭結點的異同
頭指針:
a、頭指針是指鏈表指向第一個結點的指針,若鏈表有頭結點,則是指向頭結點的指針。
b、頭指針具有標識作用,所以常用頭指針冠以鏈表的名字。
c、無論鏈表是否為空,頭指針均不為空。頭指針是鏈表的必要元素。
頭結點:
a、頭結點是為了操作的統一和方便而設立的,放在第一元素的結點之前,其數據域一般無意義(也可存放鏈表的長度)。
b、有了頭結點,對在第一元素結點前插入結點和刪除第一結點,其操作與其他結點的操作就同一了。
c、頭結點不一定是鏈表必須元素。
3、單鏈表的讀取
獲得鏈表第i個數據的算法思路:
a、聲明一個結點p指向鏈表第一個結點,初始化j從1開始。
b、當j<i時,就遍歷鏈表,讓p的指針向后移動,不斷指向下一結點,j累加1。
c、若到鏈表末尾P為空,則說明第i個元素不存在。
d、否則查找成功,返回結點P的數據。
4、單鏈表的插入與刪除
單鏈表第i個數據插入結點的算法思路:
a、聲明一結點P指向鏈表第一個結點,初始化j從1開始。
b、當j<i時,就遍歷鏈表,讓p的指針向后移動,不斷指向下一結點,j累計1.
c、若到鏈表末尾p為空,則說明第i個元素不存在。
d、否則查找成功,在系統中生成一個空結點s。
e、將數據元素e賦值給s->data。
f、單鏈表的拆標准語句s->next=p->;p->next=s。
g、返回成功。
單鏈表第i個數據刪除結點的算法思路:
a、聲明一結點p指向鏈表第一個結點,初始化j從1開始。
b、當j<i時,就遍歷鏈表,讓p的指針向后移動,不斷指向下一個結點,j累加1。
c、若到鏈表末尾p為空,則說明第i個元素不存在。
d、否則查找成功,將欲刪除的結點p->next賦值給q。
e、單鏈表的刪除標准語句p->next=q->next。
f、將q結點中的數據賦值給e,作為返回。
g、釋放q結點。
h、返回成功。
對於插入和刪除數據越頻繁的操作,單鏈表的效率優勢就越明顯。
六、單鏈表的整表創建
單鏈表整表創建的算法思路:
a、聲明一結點p和計數器變量i。
b、初始化一空鏈表L。
c、讓L的頭結點的指針指向NULL,即建立一個帶頭結點的單鏈表。
d、循環:
*生成一新結點賦值給p。
*隨機生成一數字賦值給p的數據域p->data。
*將p插入到頭結點與前一結點之間。
七、單鏈表的整表刪除
單鏈表整表刪除的算法思路如下:
a、聲明一結點p和q。
b、將第一個結點賦值給p。
c、循環:
* 將下一結點賦值給q。
*釋放p。
*將q賦值給p。
八、單鏈表結構與順序存儲結構優缺點
1、單鏈表結構和順序存儲結構對比:
a、存儲分配方式:
順序存儲結構用一段連續的存儲單元依次存儲線性表的數據元素。
單鏈表采用鏈式存儲結構,用一組任意的存儲結構單元存放線性表的元素。
b、時間性能:
查找:順序存儲結構O(1),單鏈表O(n)。
插入和刪除:順序存儲結構需要平均移動表長一半的元素,時間為O(n)。單鏈表在線出某位置的指針后,插入和刪除時間僅為O(1)。
c、空間性能:順序存儲結構需要預分配存儲空間,分大了,浪費,分小了易發生上溢。單鏈表不需要分配存儲空間,只要有就可以分配,元素個數也不受限制。
2、結論
若線性表需要頻繁查找,很少進行插入和刪除操作時,宜采用順序存儲結構。若需要頻繁插入和刪除時,宜采用單鏈表結構。
當線性表中的元素個數變化較大或者根本不知道有多大時,最好用單鏈表結構,這樣可以不需要考慮存儲空間的大小問題,如果知道大致長度,宜采用順序存儲結構。
九、循環鏈表
將單鏈表中終端結點的指針端由空指針改為指向頭結點,就使整個單鏈表形成一個環,這種頭尾相接的單鏈表稱為單循環鏈表,簡稱循環鏈表。
十、雙向鏈表
雙向鏈表是在單鏈表的每個結點中,再設置一個指向其前驅結點的指針域。