線性表
線性表的定義和基本運算
- 線性表的邏輯定義
(1) 線性表,Linear_List是最簡單和最常用的一種資料結構。
(2) 線性表是由n個數據元素(結點)a1,a2,...,an組成的 有限序列 。類比數學中的數列概念。其中我們規定陣列元素的個數n為該線性表的長度,size。當n為零時,稱為空表。
(3) 非空的線性表通常記為:(a1,a2,a3,...,an),其中ai(1<=i<=n)表示線性表的其中一個結點。
(4) a1稱為表的開始結點,無直接前驅,有一個直接後繼a2; an為表的終端結點,無直接後繼,有一個直接前驅an-1; 其餘元素ai(2<=i<=n-1)為內部元素,有前驅ai-1,後繼ai+1;
結點與結點之間是線性的關係。故稱之為線性表。
- 線性表的基本運算
(1) 置空表initlist(L),構造一個空的線性表;
(2) 求表長listLength(L),返回線性表的長度;
(3) 取元素getNode(L,i),1<=i<=n;
(4) 按值查詢 LocateNode(L,x),返回第一個為X的結點的位置,若表中不存在則返回0
(5) 插入insert(L,i,x) 在L的i位置插入x,
(6) 刪除delete(L,i) 刪除表中的第i個元素
線性表的順序儲存和基本元素的實現
- 線性表的順序儲存
(1) 線性表的順序儲存指的是將線性表的資料元素按其 邏輯順序 依次存入一組 地址連續 的儲存單元中,用這種方式儲存的線性表稱為順序表,例如陣列。
(2) 假設每個結點的空間大小都一致,即資料型別一致,例如對於每個int來說,佔用4個位元組,32位。設每個結點的空間大小為d,那麼,一般來說,線性表中第i個元素的儲存位置為: LOC(ai)=LOC(a1)+(i-1)*d (種樹比喻),其中ai的地址稱為首地址或基地址。
(3) 因為在順序表中任何一個元素的地址都可以通過計算確定,所以可以做到 隨機儲存 。舉例記憶體的讀取模式。
(4) 因為在高階程式設計語言中,陣列型別具有隨機存取的特性,因此,通常用陣列描述順序表。除了儲存線性表的結點外,還需要一個變數(size)來標識線性表的長度。
- 順序表上基本運算的實現
(1) 隨機讀取第i個元素,L[i]
(2) 置空表,L.size=0
(3) 插入insert(L,i,x) 在L的i位置插入x
(4) 刪除delete(L,i) 刪除表中的第i個元素
(5) 倒置列表reverse(L)
線性表的鏈式儲存結構
- 順序表的讀取快,但是插入與刪除緩慢,鑑於此,引申出連結串列
- 連結串列不可以隨機讀取,因為第i個元素的地址不能直接讀取到
- 單鏈表(線性連結串列)
(1) 儲存ai時,除了儲存ai本身,還儲存了ai+1的地址資訊,即C中的指標。包含了兩部分資訊的結點,含有原有資料的域為資料域,儲存直接後繼的為指標域。
(2) 採取這種儲存方式的表為連結串列,其中每一個結點的儲存結構為:[data][next]
(3) 因為每一個結點只包含1個指標域,所以稱為單鏈表。
(4) 因為第一個結點沒有直接前趨,所以特地設立一個head存放第一個元素的地址,即頭指標。而終端結點的指標域則為null。如果表中一個結點也沒有,則head=NULL
- 單鏈表上的運算
(1) 建立單鏈表:
① 頭插法: (符合先進後出特點,是天生的鏈棧)
從一個空表開始,重複讀入資料,生稱新結點,將資料存到資料域中,然後將新結點的地址存到表頭上。 插入順序與連結串列順序相反。
頭插法步驟: (如圖黑線所示,即為鏈棧的插入結果)
(1) 判斷插入列表是否為空。即長度size?=0;
(2) 讀取當前head值。 已知 頭指標head的當前值為null ;head.next = null,元素data的自身地址為stu0,stu0. next = null;
(3) 令頭指標的值指向新元素的地址。 即 head.next = stu0;
當下一個元素進行插入時,迴圈上述步驟;即當size = 1時;head.next = stu0,stu1只識別頭指標,將stu1.next = head.next,即stu1.next = stu0;最後再將head.next = stu1。
② 尾插法: (符合先進先出的特點,是天生的鏈佇列)
將新結點插入到當前連結串列的表尾,需要一個尾部指標,rear,使其始終指向連結串列的尾結點。
尾插法步驟: (如圖紅線所示,即為連結串列的插入過程)
(1)與頭插法相同, 先判斷表長size ?= 0 ;
(2) 讀取當前rear值。 當size = 0時,讀取當前rear值為null;
(3) 令尾指標rear指向新元素地址。 head.next = stu1; rear.next = stu1.next 。
需注意頭指標head指向頭元素後將不再變化,即head.next = stu1保持不變;尾插法只移動尾指標rear。
當下一個元素進行插入時,迴圈上述步驟;即當size = 1時; rear.next = stu1.next;stu2只識別尾指標rear,將rear.next = stu2,即stu1.next = stu2;
最後再將rear.next =stu2.next。
(2) 查詢運算:
① 因為連結串列中的地址隱含在前趨中,所以必須從head開始查詢
② 按結點序號查詢
③ 按結點值查詢
(3) 插入運算
(4) 刪除運算
- 單迴圈列表:終端元素設定為a1的地址,可以從任意一個位置開始查詢。
- 雙向連結串列:在指標域中加入前趨的地址,可以雙向查詢。
- 結合以上的特點可以形成迴圈雙向連結串列。