三.线性表
線性表(List):零個或者多個數據元素的有限序列
有且只有一個直接前驅元素,有且只有一個直接后繼
線性表元素的個數n(n>0)定義為線性表的長度,當n=0時,稱為空表
在較復雜的線性表中,一個數據元素可以由若干個數據項組成
線性表的順序順序存儲結構:用一段地址連續的存儲單元依次存儲線性表的數據元素
一維數組來實現順序存儲結構.
數組的長度和線性表的長度的區別?
數組的長度是存放線性表存儲空間的長度,存儲分配后這個量一般是不變的.
線性表的長度是線性表中數據元素的個數,(插入/刪除)這個量是變化的
在任何時刻,線性表的長度應該小于等于數組的長度
存儲器中的每個存儲單元都有自己的編號,這個編號稱為地址
線性表順序存儲結構的優缺點:
優點:無需為表中元素之間的邏輯關系而增加額外的存儲空間,可以快速的存取表中的任一位置的元素
缺點:插入和刪除時需要移動表中大量的元素,當線性表長度變化較大時,難以確定存儲空間的容量,造成存儲空間的碎片
線性表的鏈式存儲結構:為了表示每個數據元素ai和其直接后繼元素ai+1之間的邏輯關系,對數據元素ai來說,除了存儲其本身的信息之外,還需存儲一個指示其直接后繼的信息(即直接后繼的存儲位置).我們把存儲數據元素的信息的區域成為數據域,把直接存儲直接后繼位置的域稱為指針域.指針域中存儲的信息稱作指針或鏈.這兩部分信息組成數據元素ai的存儲映像,稱為結點(Node)
n個結點鏈接成一個鏈表,即為線性表的鏈式存儲結構.因為此鏈表的每個結點中只包含一個指針域,所以叫做單鏈表
頭指針:鏈表中第一個結點的存儲位置
頭結點:在單鏈表的第一個結點前附設一個結點(為了方便對鏈表操作)
區別?
頭指針是指鏈表指向第一個結點的指針,如果鏈表有頭結點,則指向頭結點的指針
頭指針具有標識作用,所以常以頭指針冠以鏈表的名字
無論鏈表是否為空,頭指針都不為空,頭指針是鏈表的必要元素
頭結點是為了操作的統一和方便而設立的,放在第一元素的結點之前,其數據域一般無意義(也可存放鏈表長度)
有了頭結點,對在第一個元素結點前插入結點和刪除第一結點,其操作和其他結點的操作就統一了
頭結點不一定是鏈表必須要素
單鏈表和順序存儲結構的區別:
存儲分配方式:
順序存儲結構用一段連續的存儲單元依次存儲線性表的數據元素
單鏈表采用鏈式存儲結構,用一組任意的存儲單元存放線性表的元素
時間性能:
查找:順序存儲結構O(1)單鏈表O(n)
插入和刪除:順序存儲結構需要平均移動一般的元素,時間為O(n)單鏈表在找出某位置的指針后,插入和刪除時間僅為O(1)
空間性能:
順序存儲結構需要預分配存儲空間,分大了浪費,分小了易發生上溢
單鏈表不需要分配存儲空間,只要有就可以分配,元素個數也不受限制
靜態鏈表:用數組描述的鏈表(游標實現法)
循環鏈表:將單鏈表的終端節點的指針端由空指針改為指向頭結點,就使整個單鏈表形成一個環,這種頭尾相接的單鏈表稱為單循環鏈表,簡稱循環鏈表
雙向鏈表:在單鏈表的每個結點中,再設置一個指向其前驅結點的指針域
總結