理论基础 —— 线性表
【邏輯結構】
線性表是零或多個數據元素組成的有限序列,其中,數據元素的個數定義為線性表的長度,當長度為 0 時稱為空表,反之稱為非空表。
一個非空表常記為:,其中 ai 是表中的第 i 個數據元素,表中的 ?領先于?,?領先于?,稱??是??的直接前驅元素,?是??的直接后繼元素。當??時,?有且只有一個直接后繼;當??時,?有且只有一個直接前驅。
【順序存儲結構】
1.概述
線性表的順序存儲結構稱為順序表,常用一維數組來實現,其通過數據元素物理存儲的相鄰關系來反映數據元素之間邏輯上的相鄰關系。?
線性表支持對數據元素的隨機訪問,因此屬于隨機存取結構。設順序表的每個元素占用 c 個存儲單元,則第 i 個元素的存儲地址為:
2.特點
- 無需為表示結點間的邏輯關系而增加額外的存儲空間
- 可方便地隨機讀取表中的任一元素
- 插入或刪除運算需要移動大量元素
- 表長變化較大時,難以確定合適的存儲規模
【鏈式存儲結構】
1.單鏈表
1)概述
單鏈表是用一組任意的存儲單元存放線性表的元素,這組存儲單元可以連續,也可以不連續,即邏輯順序與物理順序可以不一致,表可以進行擴充。
為了能正確的表示元素間的邏輯關系,每個存儲單元在存儲數據元素的同時,還必須存儲其后繼元素所在的地址信息,這兩部分構成了數據元素的存儲映像,稱為結點(Node)。每個結點分為兩部分,一部分是存儲數據元素的數據域,一部分是存放該結點后繼結點地址信息的指針域,通過每個結點的指針域,線性表的數據元素按其邏輯順序鏈接在一起,由于每個結點只有一個指針域,因此被稱為單鏈表。
2)頭指針與頭結點
由于單鏈表中每個結點的存儲地址存放在其前驅結點的指針域中,第一個結點沒有前驅,因此通常在單鏈表的開始結點之前設置一個頭指針,指向第一個元素所在的結點,因而頭指針具有標識單鏈表的作用;同時,由于最后一個結點沒有后繼,故通常將終端結點的指針域設為空(NULL)。
為便于處理,常在開始節點之前設置一個類型相同的頭結點,其數據域不存儲任何信息(也可存儲鏈表長度等附加信息),指針域指向開始結點,并使頭指針始終指向頭結點,這樣空表與非空表的處理就統一了。
兩者異同:
| 頭指針 | 頭結點 |
| 指向鏈表開始結點,若鏈表有頭結點,則指向頭結點 | 是為了操作統一與方便而設置的,放在開始節點之前,其數據域一般無意義 |
| 具有標識作用,常用頭指針冠以鏈表的名字 | 使對開始結點前插入結點、刪除開始結點的操作與其他結點的操作統一,便于操作 |
| 無論鏈表是否為空難,頭指針均不為空,其是鏈表的必要元素 | 頭結點不一定是鏈表的必要元素 |
3)順序表與單鏈表的比較
順序表由向量實現,是一種隨機存取結構,對表中任一結點都可以在 O(1) 時間內直接地存取,而鏈表中的結點,需從頭指針起,順著鏈找才能取得。
在鏈表中的任何位置上進行插入和刪除,都只需要修改指針,而在順序表中進行插入和刪除,平均要移動表中近一半的結點,尤其是當每個結點的信息量較大時,移動結點的時間開銷就十分大。
因此,若線性表的操作主要是進行查找,宜采用順序表存儲結構;若線性表的操作主要是插入、刪除, 宜采用鏈表做存儲結構。
2.循環鏈表
在單鏈表中,將尾結點的指針域由空結點改為指向頭結點,就使得整個單鏈表形成了一個環,不增加額外的空間,但卻對不少操作帶來了方便。其最大特點是,從循環表中任一結點出發,都能訪問到表中的其他結點。
但其也存在一定的危險性,即循環鏈表中沒有明顯的尾端,可能會使循環鏈表的處理操作進入死循環,因此需要格外注意循環條件,判斷用作循環變量的工作指針是否等于某一定指針(頭指針或尾指針),即原來是判斷 p->next!=NULL,現在是變為 p->next!=first
為使空鏈表和非空鏈表處理一致,通常設置一個頭結點。
3.雙向鏈表
對于單鏈表來說,next 字段僅指向后繼結點,不能有效的找到前驅,很多操作及其不便,因此可在單鏈表的基礎上增加一個前驅指針。
由于在雙向鏈表中既有前向鏈又有后向鏈,尋找任一個結點的直接前驅結點與直接后繼結點變得非常方便。設指針 p 指向雙鏈表中某一結點,則有:?p->llink->rlink = p = p->rlink->llink?
4.靜態鏈表
靜態鏈表是用數組來表示單鏈表,用數組元素的下標來模擬單鏈表的指針,其每個數組元素都由兩個域構成:數據域 data 存放數據元素、游標?cur?存放該元素的后繼元素所在的數組下標。
在某些程序設計語言中,沒有指針,因此,靜態鏈表的存在具有必要性。其優點在于,刪除和插入元素時不需要移動元素,直接修改 next 指針即可,效率較高,其缺點在于,不能動態的修改數組的大小,跟靜態數組一樣不能按需分配存儲空間。
存儲結構:
#define maxSize=n template<class T> struct Node{T data;//數據域int next;//指針域 }staticLink[maxSize];【實現】
總結
以上是生活随笔為你收集整理的理论基础 —— 线性表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数列分块入门 8(LibreOj-628
- 下一篇: 树形结构 —— 树与二叉树 —— 树的重