大話資料結構 線性表 3

2021-07-12 05:55:29 字數 2656 閱讀 9989

順序儲存結構的建立,其實就是乙個陣列的初始化,即宣告乙個型別和大小的陣列並賦值的過程。而單鏈表和順序儲存結構就不一樣,他不像順序儲存結構那麼集中,他可以很分散,是一種動態結構。對於每個鍊錶來說,它所占用空間的大小和位置是不需要預先分配劃定的,可以根據系統的情況和實際的需求即時生成。

所以,建立單鏈表的過程就是乙個動態生成鍊錶的過程。即從「空表」的初始狀態起,一次建立各元素結點,並逐個插入鍊錶。

單鏈表整表建立的演算法思路:

(1)宣告一節點p和計數器變數i;

(2)初始化一空鍊錶l;

(3)讓l的頭結點的指標指向null,即建立乙個帶頭結點的單鏈表;

(4)迴圈:生成一新結點賦值給p; 隨機生成一數字賦值給p的資料域p->data; 將p插入到頭結點與前乙個新節點之間(頭插法)。

頭插法實現**演算法:

void createlisthead( linklist* l, int n )}

事實上,我們也可以不這樣做。為什麼不把新節點都放在最後呢?這種應該說才是排隊的正常思維,及先來後到。這種方法又稱為「尾插法」。

當我們不打算使用這個單鏈表時,我們需要把它銷毀,其實也就是在記憶體中將他釋放掉,以便於留出空間給其他程式或軟體使用。

單鏈表整表刪除的演算法思路如下:

(1)宣告一結點p和q;

(2)將第乙個結點賦值給p;

(3)迴圈:將下乙個結點賦值給q,釋放p,將q賦值給p。

實現**演算法如下:

[cpp]view plain

copy

"font-size:18px;"

>status clearlist( linklist* l)  

(*l)->next = null;  

return

ok;  }

單鏈表結構

順序儲存結構

儲存分配方式

採用鏈式儲存結構,用一組任意的儲存單元存放線性表元素

用一段連續的儲存單元一次儲存線性表的資料元素

時間效能

查詢:o(n)

插入:o(1)

刪除:o(1)

查詢:o(1)

插入:o(n)

刪除:o(n)

空間效能

不需要分配儲存空間,只要有就可以分配,元素個數也不受限制

需要預分配儲存空間,分配大了,浪費,分配小了,易發生上溢

經驗性的結論:

(1)當線性表需要頻繁查詢,很少進行插入和刪除操作時,宜採用順序儲存結構。若需要頻繁插入和刪除操作時,宜採用單鏈表結構。比如說,遊戲開發中,對於使用者註冊的個人信心,除了註冊時插入資料外,絕大多數情況都是讀取,所以應該老呂用順序儲存結構。而遊戲的玩家的**或者裝備列表,隨著玩家的遊戲過程中,可能會隨時增加或刪除,此時再用順序儲存就不太合適,應該偏向使用單鏈表結構。

(2)當線性表中的元素個數變化較大或者根本不知道有多大時,最好用單鏈表結構,這樣可以不需要考慮儲存空間的大小問題。而如果事先知道線性表的大致長度,比如一年12個月,一周就是星期一至星期日共七天,這種用順序儲存結構效率會高很多。

對於單鏈表,由於每個結點只儲存向後的指標,到了尾標誌就停止了向後的操作。這樣,當中某一節點就無法找到它的前驅結點,難以查閱前方資料。

將單鏈表中終端結點的指標端由空指標改為指向頭結點,就使整個鍊錶形成乙個環,這種頭尾項鍊的單鏈表稱為單迴圈鍊錶,簡稱迴圈鍊錶。

其實,迴圈鍊錶和單鏈表的主要差異就在於迴圈的判斷條件上,原來是判斷p->next = null??,現在則是判斷p->next是不是等於頭結點,若不等於,則迴圈未結束。

在單鏈表中,我們有了頭結點時,我們可以用o(1)的時間訪問第乙個結點,但是對於要訪問的最後乙個結點,卻要用o(n)時間,因為我們需要將單鏈表全部掃瞄一遍。

有沒有可能用o(1)的時間由鍊錶指標訪問到最後乙個結點呢?當然可以,不過我們需要改造一下這個迴圈鍊錶,不用頭指標,而是用指向終端結點的尾指標來表示迴圈鍊錶。

此時,查詢開始結點和終端結點就很方便了。如果終端結點用尾指標rear指示,則查詢終端節點是o(1),而開始結點,其實就是rear->next->next,其時間複雜度也為o(1)。

在單鏈表中,有了next指標,這就使得我們要查詢下一節點的時間複雜度為o(1)。可是,如果我們要查詢的是上一節點的話,那最壞的時間複雜度就是o(n),因為我們每次都要從頭開始遍歷查詢。

為了克服鍊錶單向性這一弊端,相關研究人員設計了雙向鍊錶。雙向鍊錶是在單鏈表的每個節點中,在設定乙個指向其前驅結點的指標域。所以,在雙向鍊錶中的結點都有兩個指標域,乙個是指向直接後繼,乙個是指向直接前驅。

《大話資料結構》 線性表

created by pengxiangzhou on 2021 1 24.include ifndef c ds linear list h define c ds linear list h endif c ds linear list h 線性表 順序儲存結構 順序儲存結構的三個屬性 陣列da...

大話資料結構 線性表

線性表是零個或多個資料元素的有限序列。線性表的抽象資料型別定義如下 adt 線性表 list data 線性表的資料物件集合為,每個元素的型別均為datatype。其中,除第乙個元素a1外,每乙個元素有且只有乙個直接前驅元素,除了最後乙個元素an外,每乙個元素有且只有乙個直接後繼元素。資料元素之間的...

大話資料結構 線性表 2

線性表的順序儲存結構最大的缺點是插入和刪除時需要移動大量資料,這顯然就需要消耗時間。本節討論的鏈式儲存結構可以很好滴解決這個問題。線性表的鏈式儲存結構的特點是用一組任意的儲存單元儲存線性表的資料元素,這些儲存單元可以使連續的,也可以是不連續的。這就意味著,這些資料元素可以存在記憶體未被占用的任意位置...