線性表及存儲結構
線性表的定義和基本運算
- 線性表的邏輯定義
(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) 因為在高級程序設計語言中,數組類型具有隨機存取的特性,因此,通常用數組描述順序表。除了存儲線性表的結點外,還需要一個變量來標識線性表的長度。
- 順序表上基本運算的實現
(1) 隨機讀取第i個元素,L[i]
(2) 置空表,L.size=0
(3) 插入,。。。
(4) 刪除。。。
(5) 倒置列表。。。
線性表的鏈式存儲結構
- 順序表的讀取快,但是插入與刪除緩慢,鑒於此,引申出鏈表
- 鏈表不可以隨機讀取,因為第i個元素的地址不能直接讀取到
- 單鏈表(線性鏈表)
(1) 存儲ai時,除了保存ai本身,還存儲了ai+1的地址信息,即C中的指針。包含了兩部分信息的結點,含有原有數據的域為數據域,存儲直接後繼的為指針域。
(2) 采取這種存儲方式的表為鏈表,其中每一個結點的存儲結構為:[data][next]
(3) 因為每一個結點只包含1個指針域,所以稱為單鏈表。
(4) 因為第一個結點沒有直接前趨,所以特地設立一個head存放第一個元素的地址,即頭指針。而終端結點的指針域則為null。如果表中一個結點也沒有,則head=NULL
- 單鏈表上的運算
(1) 建立單鏈表:
① 頭插法:從一個空表開始,重復讀入數據,生稱新結點,將數據存到數據域中,然後將新結點的地址存到表頭上。 插入順序與鏈表順序相反。
② 尾插法:將新結點插入到當前鏈表的表尾,需要一個尾部指針,rear,使其始終指向鏈表的尾結點。
(2) 查找運算:
① 因為鏈表中的地址隱含在前趨中,所以必須從head開始查找
② 按結點序號查找:。。。
③ 按結點值查找:。。。
(3) 插入運算:
(4) 刪除運算:
- 單循環列表:終端元素設置為a1的地址,可以從任意一個位置開始查找。
- 雙向鏈表:在指針域中加入前趨的地址,可以雙向查找。
結合以上的特點可以形成循環雙向鏈表
線性表及存儲結構