1. 程式人生 > >[數據結構] - 線性表

[數據結構] - 線性表

hid lis .com 當前位置 頭結點 ++ 記憶 family width

什麽是線性表 線性表是其組成元素間具有線性關系的一種線性結構,對線性表的基本操作主要有獲得元素,設置元素值,遍歷,插入,刪除,查找,替換,和排序等,在線性表任意位置都可以插入和刪除,可以采用順序存儲結構和鏈式存儲結構表示線性表。
存儲類別 順序存儲結構 單鏈表
存儲分配方式 用一段連續的存儲單元依次存儲線性表的數據元素 采用鏈式存儲結構,用一組任意的存儲單元存放線性表的元素
時間性能 查找O(1)、插入和刪除O(n) 查找O(n)、插入和刪除O(1)
空間性能
需要預分配存儲空間,分大了浪費,小了容易發生上溢 不需要分配存儲空間,只要有就可以分配,元素個數不受限制
通過上面的對比,可以得出一些經驗性的結論:
  • 若線性表需要頻繁查找,很少進行插入和刪除操作時,宜采用順序存儲結構。若需要頻繁插入和刪除時,宜采用單鏈表結構。
  • 當線性表中的元素個數變化較大或者根本不知道有多大時,最好用單鏈表結構,這樣可以不需要考慮存儲空間的大小問題。而如果事先知道線性表的大致長度,用順序存儲結構效率會高很多.

技術分享圖片

線性表抽象數據類型 線性表(Linear List) 是由 n(n>=0) 個類型相同的數據元素組成的有限序列,(a0,a1,a2,an-1) 其中 ,元素ai 的數據類型可以是整數,浮點,字符串等,n是線性表元素個數,
稱為線性表長度(Length).若n=0,則為空表,若n>0,則ai(0<i<n-1)有且僅有一個前驅元素ai-1,和一個後繼元素ai+1. a0沒有前驅元素,an-1沒有後繼元素。 在線性表邏輯結構中,使用序號約定數據元素在線性表中的位置,即表示元素之間具有的順序關系。 線性表的順序存儲 數組: 數組是實現順序存儲結構的基礎,存儲具有相同數據類型的元素集合,一位數組占用一塊內存,數組的存儲單元個數稱為數組容量,也是數組長度,每個存儲單元地址是連續的,每個元素連續存儲,計算i個元素地址所需要的時間是個常量,時間復雜度是O(1),存取任何一個元素的時間復雜度是O(1)的數據結構是
隨機存取結構,因此數組是隨機存取結構 數組通過下表識別元素,元素的下表是其存儲單元序號,表示元素在數組中的位置,一位數組使用一個喜愛博愛唯一確定一個元素,二維數組使用兩個下表唯一確定一個元素。 數組一旦占用一片存儲空間,其地址和容量就是確定的,不能更改,一次,數組只能進行賦值,取值兩種隨機操作。不能插入,刪除。當容量不夠時不能就地擴容。 數組取值公式: 設loc(a0)表示第0個存儲地址。每個元素占用c個字節 則 aI存儲地址 Loc(ai) = Loc(a0) +i * c. 當數組容量不夠,解決辦法就是申請個容量更大的數組,然後把數據復制進去。 微信公眾號 (胡說代碼) 輸入:數組源碼 即可獲得源代碼 鏈式: 線性表的鏈式存儲結構是用若幹地址分散的存儲單元存儲數據元素,邏輯上相鄰的數據元素在物理位置不一定相鄰,因此,必須采用附加信息表上數據元素之間的順序關系,存儲一個數據元素的存儲單元稱為節點(Node)一個節點至少包含兩個部分: 節點(數據域,地址域) 其中,數據域存儲元素數據,地址域(也成為鏈)存儲前驅或後繼元素地址。 一個節點表示一個元素數據,通過節點中的地址域將節點連接起來,節點間的鏈接關系體現了線性表數據元素之間的順序關系,采用鏈式存儲結構的線性表稱為線性鏈表(Linked List)一條線性鏈表必須使用一個頭指針記住元素a0的節點位置。 每個節點只有一個地址域的的線性表稱為單鏈表(Singly Linked list) 單鏈表節點(data 數據域,next 地址域 指向後置節點) 空單鏈表的頭指針是 head = null ,最後一個節點的地址域也是null 技術分享圖片 單鏈表中的存儲空間是插入刪除中動態申請和釋放的,不需要給單鏈表預先分配存儲空間,這樣就可以避免順序表因為空間不足,需要拷貝復制擴大空間,提高了運動效率和存儲空間利用率。對單鏈表插入和刪除操作只需要改變少量幾個節點,不需要移動元素數據。 在c/c++中使用指針存儲地址實現鏈式存儲結構,java中沒有指針使用引用來存儲,引用是比指針更安全的一種連接方式,有指針的全部功能,而且避免了指針使用不當產生的安全性問題。 單鏈表: 單鏈表是由一個一個節點連接成的。 頭節點: 單鏈表的存儲結構通常是帶頭結點的,在單鏈表最前增加一個特殊的節點,稱為頭節點,忽略其數據域,單鏈表的頭指針head指向頭結點,頭節點 next域 指向單鏈表第0個元素, 空單鏈表只有一個頭節點,head.next == null.遍歷起始位置是 p=head.next 頭插入和頭刪除不會改變head.有了頭節點 單鏈表 插入和刪除就不需要分開操作 技術分享圖片 微信公眾號 (胡說代碼) 輸入:單鏈表源碼 即可獲得源代碼 雙鏈表(Doubly Linked Link) 在單鏈表中,每個節點只有一個指向後置節點的鏈,若要查找前驅節點,必須從單鏈表頭指針開始沿著鏈表方向逐漸檢索,操作效率很低,此時需要采用雙鏈表。 雙鏈表節點(data數據域,prev前驅節點,next後繼節點) 雙鏈表比單鏈表增加了一個前驅節點,給鏈表操作帶來了很大的方便,能沿著向前,向後對雙鏈表進行遍歷 循環雙鏈表(Circular Doubly Linked Link) 如果雙鏈表的最後一個節點的next指向頭節點,頭結點的prev指向最後一個節點,則構成循環雙鏈表 微信公眾號 (胡說代碼) 輸入:循環雙鏈表源碼 即可獲得源代碼 註: 隨機存取存儲器概述: 隨機存取存儲器(RAM)是計算機存儲器中最為人熟知的一種。之所以RAM被稱為“隨機存儲”,是因為您可以直接訪問任一個存儲單元,只要您知道該單元所在記憶行和記憶列的地址即可。 與RAM形成鮮明對比的是順序存取存儲器(SAM)。SAM中的數據存儲單元按照線性順序排列,因而只能依順序訪問(類似於盒式錄音帶)。如果當前位置不能找到所需數據,就必須依次查找下一個存儲單元,直至找到所需數據為止。SAM非常適合作緩沖存儲器之用,一般情況下,緩存中數據的存儲順序與調用順序相同(顯卡中的質素緩存就是個很好的例子)。而RAM則能以任意的順序存取數據。

[數據結構] - 線性表