迴圈鍊錶:在單鏈表中,如果將終端結點的指標域由空指標改為指向頭結點,就使得整個單鏈表形成乙個環,這種頭尾相接的單鏈表稱為迴圈單鏈表,簡稱迴圈鍊錶。
在用頭指標指示的迴圈鍊錶中,找到開始結點的時間是o(1),然而要找到終端結點,則需從頭指標遍歷整個迴圈鍊錶,其時間是o(n)。
在很多實際問題中,操作時在表的首或尾進行,此時頭指標指示的迴圈鍊錶就顯得不夠方便,如果改用指向終端結點的尾指標(rear pointer)來指示迴圈鍊錶,則查詢開始結點和終端結點都很方便,他們的儲存位址分別是rear--->next和rear,顯然時間都是o(1).
雙鏈表:如果希望快速確定表中任一結點的前驅點,可以在單鏈表的每個結點中在設定乙個指向前驅結點的指標域,這樣就形成了雙鏈表。
和單鏈表類似,雙鏈表一般也是由頭指標唯一確定,增加頭結點也能使雙鏈表的某些操作變得方便,將頭結點和尾結點鏈結起來也能構成迴圈雙鏈表,這樣無論是插入還是刪除操作,對鍊錶中開始結點、終端結點和中間任意結點的操作過程相同。實際應用中常採用帶頭結點的迴圈雙鏈表!
順序表和煉表的比較操作:
1.時間效能比較:所謂時間效能是指基於某種儲存結構的基本操作的時間複雜度。
順序表的按位置隨機訪問快,時間複雜度為o(1),鍊錶的按位置訪問只能從表頭開始依次向後掃瞄,直到找到那個特定的位置,所需要的平均時間為o(n).
順序表中進行插入和刪除操作需移動表長一半的元素,平均時間為o(n).鍊錶中進行插入和刪除操作不需要移動元素,在給出指向鍊錶中某個合適位置的指標後,插入和刪除操作所需的時間僅為o(1).
若線性表需頻繁進行插入和刪除操作,則宜採用鍊錶作為儲存過程。
2.空間效能比較:所謂空間效能是某種儲存結構所占用的儲存空間的大小。
首先定義結點的儲存密度:儲存密度=資料域占用的儲存量/這個結點所占用的儲存量。
順序表中每個結點(即陣列元素)只存放資料元素,其儲存密度為1;而鍊錶的每個結點除了存放資料元素,還要儲存指示資料元素之間邏輯關係的指標。
由於順序表需要預分配一定長度的儲存空間,如果事先不知道線性表的大致長度,則可能對儲存空間預分配得過大,致使儲存儲存空間得不到充分利用,造成浪費,若估計得過小,又將發生上溢而造成儲存空間的在分配;單鏈表不需要為其預分配空間,只要有記憶體空間可以分配,鍊錶中的元素個數就沒有限制。
一般規律:當線性表中元素個數變化較大或者未知時,最好使用鍊錶實現,如果事先知道線性表的長度,使用順序表的效率會更高!
雙鏈表 迴圈鍊錶 靜態鍊錶
一 雙鏈表 單鏈表有乙個大問題就是訪問後繼結點比較方便,但是如果訪問前驅結點,就需要從頭開始來一遍,時間複雜度為o n 這就很讓人不爽了,所以就有了雙鏈表。顧名思義,雙鏈表就是結點中有兩個指標prior和next,分別指向其前驅結點和後繼結點。如下圖所示 雙鏈表中結點型別的描述如下 typedef ...
迴圈鍊錶和雙鏈表
1 假設在長度大於1的單迴圈鍊錶中,既無頭結點也無頭指標。s為指向某個結點的指標,試編寫演算法刪除結點 s的直接前驅結點。2 已知由單鏈表表示的線性表中,含有三類字元的資料元素 如 字母 數字和其它字元 設計演算法構造三個以迴圈鏈表示的線性表,使每乙個表中只含同一類的字元,且利用原表中的結點空間作為...
雙鏈表 迴圈鍊錶
一 雙鏈表 對於雙鏈表,採用類似於單鏈表的型別定義,其dlinklist型別的定義如下 typedef struct dnode 宣告雙鏈表節點型別 dlinklist 1.建立雙聯表 1 頭插法 void createlistf dlinklist l,elemtype a,int n 頭插法建立...