數據結構 鏈表_雙向鏈表的介面定義

来源:http://www.cnblogs.com/idreamo/archive/2017/11/18/7857836.html
-Advertisement-
Play Games

雙向鏈表中的每一個元素都由3部分組成:除了數據成員、next指針外,每個元素還包含一個指向其前驅元素的指針,稱為prev指針。雙向鏈表的組成是這樣的:將一些元素鏈接在一起,使得每個元素的next指針都指向其後繼的元素,而每個元素的prev指針都指向其前驅元素。 ...


雙向鏈表介紹

雙向鏈表中的每一個元素都由3部分組成:除了數據成員、next指針外,每個元素還包含一個指向其前驅元素的指針,稱為prev指針。雙向鏈表的組成是這樣的:將一些元素鏈接在一起,使得每個元素的next指針都指向其後繼的元素,而每個元素的prev指針都指向其前驅元素。

為了標識鏈表的頭和尾,將第一個元素的prev指針和最後一個元素的next指針設置為NULL。

要反向遍歷整個雙向鏈表,使用prev指針以從尾到頭的順序連續訪問各個元素。當我們知道某個元素存儲在鏈表在的某處時,我們可以選擇按何種方式訪問到它,這會非常有幫助。例如,雙向鏈表的一種靈活性在於它提供了一種比單鏈表更直觀的方式移除一個元素。

向鏈表介面定義

dlist_init
void dlist_init(DList *list, void(*destroy)(void *data));
返回值:無
描述:初始化由list所指向的雙向鏈表。該函數必須在雙向鏈表做其他任何操作之前調用。當調用dlist_destroy時,這裡傳入的destroy參數提供了一種釋放動態分配空間的方法。它的工作方式如同單鏈表中的list_destroy。對於雙向鏈表,如果其中包含不需要手動釋放空間的數據,destroy參數應該設置為NULL。
複雜度:O(n)







dlist_destroy
void dlist_destroy(DList *list);
返回值:無
描述:銷毀由參數list所指定的雙向鏈表。調用該函數後不允許再執行其他操作,除非用戶再次調用dlist_init。dlist_destroy將移除鏈表中的所有元素,如果傳給dlist_init的參數destroy不為NULL,則調用destroy所指定的函數,對鏈表中每個移除的元素數據施行資源回收操作。
複雜度:O(n),這裡n代表雙向鏈表中的元素個數。







dlist_ins_next
int dlist_ins_next(DList *list, DLIstElmt *element,const void *data)
返回值:如果插入成功則返回1,否則返回-1。
描述:將元素插入由list指定的雙向鏈表的element元素之後 。當插入空鏈表中時,element可能指向任何位置,為了避免混淆,element此時應該設置為NULL。新的元素包含一個指向data的指針,因此只要該元素仍在鏈表中,data所引用的記憶體空間就應該保持合法。 由調用者負責管理data所引用的存儲空間。
複雜度:O(1)







dlist_ins_prev
int dlist_ins_prev(DList *list, DLIstElmt *element,const void *data)
返回值:無
描述:將元素插入由list指定的雙向鏈表的element元素之前 。當插入空鏈表中時,element可能指向任何位置,為了避免混淆,element此時應該設置為NULL。新的元素包含一個指向data的指針,因此只要該元素仍在鏈表中,data所引用的記憶體空間就應該保持合法。 由調用者負責管理data所引用的存儲空間。
複雜度:O(1)







dlist_remove
int dlist_remove(DList *list, DLIstElmt *element,const void *data)
返回值:如果移除成功則返回0,否則返回-1。
描述:從由list指定的雙向鏈表中移除由element所指定的元素。函數返回後,參數data將指向已移除元素中存儲的數據域。由調用者負責管理data所引用的存儲空間。
複雜度:O(1)







dlist_size
intdlist_size(DList *list)
返回值:鏈表中的元素個數 。
描述:這是一個巨集,用來計算由list所指定的雙向鏈表中的元素個數。
複雜度:O(1)







dlist_head
DListElmt *dlist_head(const DList *list)
返回值:返回鏈表的頭元素。
描述:這是一個巨集,用來返回由list所指定的雙向鏈表中的頭元素。
複雜度:O(1)







dlist_tail
DListElmt *dlist_tail(const DList *list)
返回值:返回鏈表的尾元素。
描述:這是一個巨集,用來返回由list所指定的雙向鏈表中的尾元素。
複雜度:O(1)







dlist_is_head
int *dlist_is_head(const DListElmt *element)
返回值:如果由參數element所指定的元素是鏈表頭元素則返回1;否則返回0。
描述:這是一個巨集,用來判斷由參數element所指定的元素是否為鏈表頭元素。
複雜度:O(1)







dlist_is_tail
int *dlist_is_tail(const DListElmt *element)
返回值:如果由參數element所指定的元素是鏈表尾元素則返回0;否則返回-1。
描述:這是一個巨集,用來判斷由參數element所指定的元素是否為鏈表尾元素。
複雜度:O(1)







dlist_data
int *dlist_data(const DListElmt *element)
返回值:返回由element所指定的鏈表元素的數據域。
描述:這是一個巨集,用來返回由element所指定的雙向鏈表元素的數據域。
複雜度:O(1)







dlist_next
DListElmt *dlist_next(const DListElmt *element)
返回值:返回由element所指定的元素的下一個元素。
描述:這是一個巨集,用來返回由element所指定的鏈表元素的後繼元素。
複雜度:O(1)







dlist_prev
DListElmt *dlist_prev(const DListElmt *element)
返回值:返回由element所指定的元素的前驅元素。
描述:這是一個巨集,用來返回由element所指定的鏈表元素的前驅元素。
複雜度:O(1)

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • static修飾的成員變數和成員方法獨立於該類的任何對象。也就是說,它不依賴類特定的實例,被類的所有實例共用。 只要這個類被載入,Java虛擬機就能根據類名在運行時數據區的方法區內定找到他們。因此,static對象可以在它的任何對象創建之前訪問,無需引用任何對象。 1、static變數 按照是否靜態 ...
  • 題目描述: Reverse a singly linked list. 解題思路: 可用遞歸的方法對鏈表進行反轉。 代碼: 解題收穫: 溫習了基本的遞歸思想和鏈表的使用。但做的時候還是迷茫了很久,說明對鏈表的使用還是不太熟悉。 ...
  • 本文重點介紹使用Eclipse+pydev插件來寫Python代碼, 以及在Mac上配置Eclipse+Pydev 和Windows配置Eclipse+Pydev 轉載:https://www.cnblogs.com/Bonker/p/3584707.html 編輯器:Python 自帶的 IDLE ...
  • 1.前言 上次我們認識了java責任鏈模式的設計,那麼接下來將給大家展示責任鏈模式項目中的實際運用。如何快速搭建責任鏈模式的項目中運用。 2.簡單技術準備 我們要在項目中使用藉助這樣的幾個知識的組合運用,才能更好的詮釋。必備技能:簡單註解的定義;Spring攔截器的使用;簡答的責任鏈模式的定義;擁有 ...
  • 參考鏈接: - https://www.zhihu.com/question/64414628 php fpm 進程數和併發數是什麼關係? - https://segmentfault.com/q/1010000005942449/a-1020000012063637 php不支持多線程所以不用考慮 ...
  • http://blog.chinaunix.net/uid-28458801-id-4200573.html 一、typeof詳解: 前言: typeof關鍵字是C語言中的一個新擴展,這個特性在linux內核中應用非常廣泛。(其實這和C++的auto關鍵字和可以推斷decltype關鍵字相當類似) ...
  • 一、單系統登錄機制1、http無狀態協議 web應用採用browser/server架構,http作為通信協議。http是無狀態協議,瀏覽器的每一次請求,伺服器會獨立處理,不與之前或之後的請求產生關聯,這個過程用下圖說明,三次請求/響應對之間沒有任何聯繫 但這也同時意味著,任何用戶都能通過瀏覽器訪問 ...
  • Struts2 框架入門及結合Intellj idea完成登陸demo測試 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...