粗識靜態鏈表

為了彌補鏈表在內存分配上的不足,出現了靜態鏈表這么一個折中的辦法。靜態鏈表比較類似于內存池,它會預先分配一個足夠長的數組,之后鏈表節點都會保存在這個數組里,這樣就不需要頻繁的進行內存分配了。

當然,這個方法的缺點是需要預先分配一個足夠長的數組,肯定會導致內存的浪費。數組不夠長到不是什么大不了的,使用第一節的動態擴容方法就是了。

靜態鏈表一般是由兩個鏈表組成,一個保存數據的鏈表,一個空閑節點的鏈表,如圖 3 所示。

圖 3 靜態鏈表

當需要向鏈表中添加節點時,就從空閑鏈表中摘下一個使用。從鏈表中刪除節點時,就將被刪除的節點歸還到空閑鏈表中。

在實現上,由于靜態鏈表的節點都是存儲在數組中的,所以經常使用數組索引代替指針,如果數組擴容了,也不會影響現有的節點。下面簡單的實現了一個靜態雙向鏈表,沒有添加動態擴容的能力。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
struct?snode {
????int?value;
????int?prev;
????int?next;
};
struct?sllist {
????snode *nodes;
????int?head, freeHead;
????sllist():head(-1), freeHead(0) {
????????// 初始化空閑鏈表,靜態分配長度為 100。
????????nodes =?new?snode[100];
????????for?(int?i = 0;i < 100;i++) {
????????????nodes[i].next = i + 1;
????????}
????}
????void?add(int?value) {
????????// 從空閑鏈表中摘取節點。
????????int?newNode = freeHead;
????????freeHead = nodes[freeHead].next;
????????nodes[newNode].value = value;
????????nodes[newNode].prev = -1;
????????nodes[newNode].next = head;
????????if?(head != -1) {
????????????nodes[head].prev = newNode;
????????}
????????head = newNode;
????}
????void?remove(snode node) {
????????int?idx = head;
????????if?(node.prev == -1) {
????????????head = node.next;
????????}?else?{
????????????idx = nodes[node.prev].next;
????????????nodes[node.prev].next = node.next;
????????}
????????if?(node.next != -1) {
????????????nodes[node.next].prev = node.prev;
????????}
????????// 將節點歸還空閑鏈表。
????????nodes[idx].next = freeHead;
????????freeHead = idx;
????}
};

靜態鏈表的效率幾乎跟數組一樣,極大的提升了鏈表的效率。不過因為鏈表的效率受內存分配影響,不同的語言可能有不同的表現,具體情況還需要實驗分析才可以。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453429.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453429.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453429.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

php用date語句獲取時間,關于php date()函數獲取時間的設置和使用方法

date()函數是PHP自帶的時間函數&#xff0c;可以獲取當前服務器的時間echo date(Y-m-d H:i:s); //輸出:2020-05-18 11:02:35date()函數中可以使用的字母含義&#xff1a;a-"am"(上午)或者"pm"(下午)A-"AM"或者"PM"Y-年&#xff0c;顯示…

Django_form補充

問題1: 注冊頁面輸入為空&#xff0c;報錯&#xff1a;keyError&#xff1a;找不到passworddef clean(self): print("---",self.cleaned_data) # if self.cleaned_data["password"]self.cleaned_data["repeat_password"]: …

WF4.0:NativeActivity中的錯誤處理

備注&#xff1a;這篇文章的使用環境是.NET framework 4.0 RC 1 在WF4中創建native活動時&#xff0c;NativeActivity是非常強大的。其眾多的功能之一是圍繞錯誤處理。 調度子活動的時的基本錯誤處理。 當NativeActivity執行的時候&#xff0c;它是通過一個NativeActivityConte…

程序員提高建議之踏踏實實“扎馬步”

踏踏實實“扎馬步” 今天無意中看了“校長”的“程序員&司機”&#xff0c;其中談到了關于程序員速成的問題。其實速成班畢業的“系統殺手”早已在遍布大江南北&#xff0c;只是在互聯網時代&#xff0c;互聯網的應用型軟件生命周期越來越短&#xff0c;業務驅動主導…

c語言scanf返回值

1. scanf 函數是有返回值的&#xff0c;它的返回值可以分成三種情況1) 正整數&#xff0c;表示正確輸入參數的個數。例如執行 scanf("%d %d", &a, &b);如果用戶輸入"3 4"&#xff0c;可以正確輸入&#xff0c;返回2&#xff08;正確輸入了兩個變量…

gpgga格式讀取MATLAB,GPS編碼格式及讀取.doc

GPS接收機只要處于工作狀態就會源源不斷地把接收并計算出的GPS導航定位信息通過串口傳送到計算機中。前面的代碼只負責從串口接收數據并將其放置于緩存&#xff0c;在沒有進一步處理之前緩存中是一長串字節流&#xff0c;這些信息在沒有經過分類提取之前是無法加以利用的。因此…

Cadence 電源完整性仿真實踐(二)

轉載于:http://blog.csdn.net/wu20093346/article/details/38050917 通過以上步驟對每個平面進行了單節點分析并觀測了響應曲線&#xff0c;接下來將觀測平面對的目標阻抗是否滿足要求&#xff0c;通過選擇電容器的方法來減小含有電容器阻抗響應曲線中的反諧振波峰。在SigWave窗…

Johnson 全源最短路徑算法

解決單源最短路徑問題&#xff08;Single Source Shortest Paths Problem&#xff09;的算法包括&#xff1a; Dijkstra 單源最短路徑算法&#xff1a;時間復雜度為 O(E VlogV)&#xff0c;要求權值非負&#xff1b; Bellman-Ford 單源最短路徑算法&#xff1a;時間復雜度為 O…

單循環鏈表中設置尾指針比設置頭指針更好的原因

尾指針是指向終端結點的指針&#xff0c;用它來表示單循環鏈表可以使得查找鏈表的開始結點和終端結點都很方便。 設一帶頭結點的單循環鏈表&#xff0c;其尾指針為rear&#xff0c;則開始結點和終端結點的位置分別是rear->next->next和rear,查找時間都是O(1)。 若用頭指…

為何大部分人成不了技術專家?

此文為我在CSDN的新的SNS里看到的&#xff0c;感觸很深&#xff0c;和大家分享一下.里面的許多人的觀點都讓我受益匪淺。 如果你是項目經理&#xff0c;產品經理或者架構師&#xff0c;我真誠邀請你加入 如果你還是學生或者還是初學者&#xff0c;我建議你先等等&#xff0c;…

Machine Learning 學習筆記1 - 基本概念以及各分類

What is machine learning? 并沒有廣泛認可的定義來準確定義機器學習。以下定義均為譯文&#xff0c;若以后有時間&#xff0c;將補充原英文...... 定義1、來自Arthur Samuel&#xff08;上世紀50年代、西洋棋程序&#xff09; 在進行特定編程的情況下給予計算機學習能力的領域…

值傳遞與地址傳遞

值傳遞與地址傳遞的區別&#xff1a;兩者其實傳遞的都是一個內存單元的內容。不同的是&#xff0c;值傳遞傳遞的內容是一個變量的值&#xff0c;得到這個值后&#xff0c;對這個值的修改不能改變原變量的值&#xff1b;而地址傳遞傳遞的是一個變量的地址&#xff0c;得到傳遞的…

蒙特 卡羅方法matlab,蒙特·卡羅方法中的數學之美,你一定不想錯過

原標題&#xff1a;蒙特卡羅方法中的數學之美&#xff0c;你一定不想錯過有方教育——我們致力于為中學生提供學界和業界前沿的學術科研教育內容&#xff0c;幫助學生參加海外科研項目&#xff0c;在提升申請競爭力的同時&#xff0c;獲得領跑優勢。一、概述蒙特卡羅方法(Monte…

【 CDN 最佳實踐】CDN 命中率優化思路

CDN 在靜態資源的加速場景中是將靜態資源緩存在距離客戶端較近的CDN 節點上&#xff0c;然后客戶端訪問該資源即可通過較短的鏈路直接從緩存中獲取資源&#xff0c;而避免再通過較長的鏈路回源獲取靜態資源。因此 CDN的緩存命中率的高低直接影響客戶體驗&#xff0c;而保證較高…

職場新人的入門法則:少想、多做、立即執行!

對于剛進入職場的新人來說&#xff0c;要想在工作中快速獲得成長&#xff0c;唯一辦法就是&#xff1a;“少想&#xff0c;多做&#xff0c;立即執行&#xff01;”。 少想不等于盲目&#xff0c;在保證工作思路絕對清晰的同時&#xff0c;執行力越高&#xff0c;執行速度越快…

Python基礎-time and datetime

一、在Python中&#xff0c;通常有這幾種方式來表示時間&#xff1a; 時間戳格式化的時間字符串元組&#xff08;struct_time&#xff09;共九個元素。由于Python的time模塊實現主要調用C庫&#xff0c;所以各個平臺可能有所不同。1.時間戳&#xff08;timestamp&#xff09;的…

實際應用中帶頭節點的線性鏈表

/*帶頭節點的線性鏈表類型*/ typedef char ElemType//結點類型 typedef struct LNode {char data;struct LNode *next; }*Link,*Position;//鏈表類型 typedef struct {Link head,tail;int len; }LinkList;/**/ /*一些在其他函數定義中會調用的函數*/ /**//*---compare---比較兩…

matlab中歐姆如何表示,在excel中歐姆符號怎么打

在excel中歐姆符號怎么打&#xff0c;相信對于好多熟練用excel的朋友來說&#xff0c;是很簡單不過的&#xff0c;但是對于有些初學者來說&#xff0c;就是菜鳥啦&#xff0c;就有點懵懵懂懂的感覺了&#xff0c;畢竟剛接觸的東西還沒用過嘛。但是&#xff0c;沒關系今天筆者就…

原生js系列之DOM工廠模式

寫在前面 如今&#xff0c;在項目中使用React、Vue等框架作為技術棧已成為一種常態&#xff0c;在享受帶來便利性的同時&#xff0c;也許我們漸漸地遺忘原生js的寫法。 現在&#xff0c;是時候回歸本源&#xff0c;響應原始的召喚了。本文將一步一步帶領大家封裝一套屬于自己的…

武術與軟件設計 - 簡單即是最好

偶然間在公車上看見一個講中國功夫的特輯&#xff0c;說道香港武打片的發展歷程&#xff0c;當然就不得不提起李小龍先生&#xff0c;我們知道他截拳道的威力&#xff0c;這時候我記得在看李小龍傳奇時他所說的一些話&#xff0c;當他和美國一個高手比武后他輸了&#xff0c;最…