數據結構之鏈表(雙鏈表)

目錄

一、雙向帶頭循環鏈表

概念

?二、哨兵位的頭節點

優點:

頭節點的初始化

三、帶頭雙向鏈表的實現

1.雙鏈表的銷毀

2.雙鏈表的打印

3.雙鏈表的尾插和頭插

尾插:

頭插:

4.雙鏈表的尾刪和頭刪

尾刪:

頭刪:

5.雙鏈表的查找

四、測試代碼


一、雙向帶頭循環鏈表

概念

? ? ? ? 名如其實,這個鏈表結構有哨兵位頭節點,雙向并且循環,結構最復雜。一般用在單獨存儲數據。實際中使用的鏈表數據結構,都是帶頭雙向循環鏈表。另外這個結構雖然結構復雜,但是使用代碼實現以后會發現結構會帶 來很多優勢,實現反而簡單了,后面我們代碼實現了就知道了這里我們用一張圖片就能很好的看清楚雙向帶頭循環鏈表的結構了。

?二、哨兵位的頭節點

? ? ? ? 從上一篇文章我們就在說帶頭/不帶頭,那么這個頭是什么呢?其實它就是哨兵位的頭節點。這個節點一般在一個鏈表的最前方的位置,不用來儲存數據。

優點:

1.?? ?簡化邊界條件處理:
??? ?在沒有哨兵節點的情況下,鏈表的頭插、頭刪等操作需要特別處理頭節點為空的情況。
??? ?使用哨兵節點后,頭節點始終存在,簡化了插入和刪除操作的邏輯,不需要單獨處理頭節點為空的情況。

2.?? ?統一操作邏輯:
??? ?無論是頭插、尾插、頭刪還是尾刪,操作邏輯都可以統一處理,不需要區分是否是第一個節點。
??? ?例如,插入操作總是插入到哨兵節點之后,刪除操作總是刪除哨兵節點之后的節點。

3.?? ?提高代碼可讀性和維護性:
??? ?由于邊界條件處理簡化,代碼邏輯更加清晰,減少了出錯的可能性。
??? ?代碼維護起來也更加方便,因為不需要在多個地方處理特殊情況。
4.?? ?便于實現某些算法:
??? ?在某些算法中,使用哨兵節點可以避免多次檢查鏈表是否為空的情況,提高算法的效率。

頭節點的初始化

// 創建返回鏈表的頭結點.
ListNode* ListCreate()
{ListNode* newnode = (ListNode*)malloc(sizeof(ListNode));if (newnode == NULL){perror("malloc failed");exit(-1);}newnode->data = 0;newnode->next = newnode;newnode->prev = newnode;return newnode;
}

三、帶頭雙向鏈表的實現

1.雙鏈表的銷毀

? ? ? ? 與單鏈表的銷毀類似,需要定義一個指針來遍歷整個鏈表,但是注意,如果是從頭節點開始遍歷,我們會因為無法很好的控制停止條件而導致無限循環,所以我們從頭節點的下一個開始遍歷,當這個cur指針指向頭節點時就停止,這里后面還會反復用到,請務必想清楚。

// 雙向鏈表銷毀
void ListDestory(ListNode* plist)
{assert(plist);ListNode* cur = plist->next;while (cur != plist){ListNode* next = cur->next;free(cur);cur = next;}free(plist);plist = NULL;
}

2.雙鏈表的打印

// 雙向鏈表打印
void ListPrint(ListNode* plist)
{ListNode* cur = plist->next;while (cur != plist){printf("%d<=>",cur->data);cur = cur->next;}printf("NULL\n");
}

3.雙鏈表的尾插和頭插

尾插:

// 雙向鏈表尾插
void ListPushBack(ListNode* plist, LTDataType x)
{// 雙向鏈表的找尾很簡單,只需要指向plist的前一個節點就行ListNode* newnode = buyNewnode(x);ListNode* tail = plist->prev;tail->next = newnode;newnode->prev = tail;newnode->next = plist;plist->prev = newnode;
}

頭插:

// 雙向鏈表頭插
void ListPushFront(ListNode* plist, LTDataType x)
{assert(plist);ListNode* newnode = buyNewnode(x);ListNode* head = plist->next;plist->next = newnode;newnode->prev = plist;newnode->next = head;head->prev = newnode;
}

4.雙鏈表的尾刪和頭刪

尾刪:

// 雙向鏈表尾刪
void ListPopBack(ListNode* plist)
{assert(plist);if (plist->next == plist){return;}ListNode* tail = plist->prev;ListNode* prev = tail->prev;free(tail);tail = NULL;prev->next = plist;plist->prev = prev;
}

頭刪:

// 雙向鏈表頭刪
void ListPopFront(ListNode* plist)
{assert(plist);if (plist->next = plist){return;}ListNode* head = plist->next;ListNode* newHead = head->next;free(head);head = NULL;plist->next = newHead;newHead->prev = plist;
}

5.雙鏈表的查找

// 雙向鏈表查找
ListNode* ListFind(ListNode* plist, LTDataType x)
{assert(plist);ListNode* cur = plist->next;while (cur != plist){if (cur->data == x){return cur;}cur = cur->next;}return NULL;
}

四、測試代碼


// 2、帶頭+雙向+循環鏈表增刪查改實現
typedef int LTDataType;
typedef struct ListNode
{LTDataType data;struct ListNode* next; struct ListNode* prev;
}ListNode;
// 創建返回鏈表的頭結點.
ListNode* buyNewnode(LTDataType x)
{ListNode* newnode = (ListNode*)malloc(sizeof(ListNode));if (newnode == NULL){perror("malloc failed");exit(-1);}newnode->data = x;newnode->next = NULL;newnode->prev = NULL;return newnode;
}
ListNode* ListCreate()
{ListNode* newnode = (ListNode*)malloc(sizeof(ListNode));if (newnode == NULL){perror("malloc failed");exit(-1);}newnode->data = 0;newnode->next = newnode;newnode->prev = newnode;return newnode;
}
// 雙向鏈表銷毀
void ListDestory(ListNode* plist)
{assert(plist);ListNode* cur = plist->next;while (cur != plist){ListNode* next = cur->next;free(cur);cur = next;}free(plist);plist = NULL;
}
// 雙向鏈表打印
void ListPrint(ListNode* plist)
{ListNode* cur = plist->next;while (cur != plist){printf("%d<=>",cur->data);cur = cur->next;}printf("NULL\n");
}
// 雙向鏈表尾插
void ListPushBack(ListNode* plist, LTDataType x)
{// 雙向鏈表的找尾很簡單,只需要指向plist的前一個節點就行ListNode* newnode = buyNewnode(x);ListNode* tail = plist->prev;tail->next = newnode;newnode->prev = tail;newnode->next = plist;plist->prev = newnode;
}
// 雙向鏈表尾刪
void ListPopBack(ListNode* plist)
{assert(plist);if (plist->next == plist){return;}ListNode* tail = plist->prev;ListNode* prev = tail->prev;free(tail);tail = NULL;prev->next = plist;plist->prev = prev;
}
// 雙向鏈表頭插
void ListPushFront(ListNode* plist, LTDataType x)
{assert(plist);ListNode* newnode = buyNewnode(x);ListNode* head = plist->next;plist->next = newnode;newnode->prev = plist;newnode->next = head;head->prev = newnode;
}
// 雙向鏈表頭刪
void ListPopFront(ListNode* plist)
{assert(plist);if (plist->next = plist){return;}ListNode* head = plist->next;ListNode* newHead = head->next;free(head);head = NULL;plist->next = newHead;newHead->prev = plist;
}
// 雙向鏈表查找
ListNode* ListFind(ListNode* plist, LTDataType x)
{assert(plist);ListNode* cur = plist->next;while (cur != plist){if (cur->data == x){return cur;}cur = cur->next;}return NULL;
}
int main()
{ListNode* plist = ListCreate();ListPushBack(plist, 1);ListPushBack(plist, 2);ListPushBack(plist, 3);ListPrint(plist);ListPopBack(plist);ListPrint(plist);ListPushFront(plist, 0);ListPrint(plist);ListPopFront(plist);ListPrint(plist);return 0;
}

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

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

相關文章

ASP3605同步降壓調節器——滿足汽車電子嚴苛要求的電源芯片方案

ASP3605高效同步降壓調節器&#xff0c;通過AEC-Q100 Grade1認證&#xff0c;輸入電壓4V至15V&#xff0c;輸出電流5A&#xff0c;峰值效率94%。車規級型號ASP3605A3U支持-40C至125C工作溫度&#xff0c;適用于ADAS、車載信息娛樂系統等場景。 面向汽車電子的核心功能設計 1. …

vue3+Ts+elementPlus二次封裝Table分頁表格,表格內展示圖片、switch開關、支持

目錄 一.項目文件結構 二.實現代碼 1.子組件&#xff08;表格組件&#xff09; 2.父組件&#xff08;使用表格&#xff09; 一.項目文件結構 1.表格組件&#xff08;子組件&#xff09;位置 2.使用表格組件的頁面文件&#xff08;父組件&#xff09;位置 3.演示圖片位置 ele…

[特殊字符]1.2.1 新型基礎設施建設

&#x1f680; 新型基礎設施建設全解析 &#x1f31f; 核心概念與定義 維度詳細內容定義以新發展理念為引領&#xff0c;以技術創新為驅動&#xff0c;以信息網絡為基礎&#xff0c;提供數字轉型、智能升級、融合創新服務的基礎設施體系。提出背景2018年中央經濟工作會議首次提…

SQL Server數據庫慢SQL調優

SQL Server中慢SQL會顯著降低系統性能并引發級聯效應。首先&#xff0c;用戶直接體驗響應時間延長&#xff0c;核心業務操作&#xff08;如交易處理、報表生成&#xff09;效率下降&#xff0c;導致客戶滿意度降低甚至業務中斷。其次&#xff0c;資源利用率失衡&#xff0c;CPU…

【安全運營】安全運營關于告警降噪的一些梳理

目錄 前言一、智能技術層面1、機器學習和 AI 模型訓練2、攻擊成功判定 二、多源關聯分析1、多源設備關聯&#xff08;跨設備日志整合&#xff09;2、上下文信息增強 三、業務白名單和策略優化1、動態白名單機制2、閾值和規則調整 四、自動化和流程化1、告警歸并與去重2、同類型…

逆向中常見的加密算法識別

1、base64及換表 base64主要是將輸入的每3字節&#xff08;共24bit&#xff09;按照每六比特分成一組&#xff0c;變成4個小于64的索引值&#xff0c;然后通過一個索引表得到4個可見的字符。 索引表為一個64字節的字符串&#xff0c;如果在代碼中發現引用了這個索引表“ABCDEF…

《UNIX網絡編程卷1:套接字聯網API》第2章 傳輸層:TCP、UDP和SCTP

《UNIX網絡編程卷1&#xff1a;套接字聯網API》第2章 傳輸層&#xff1a;TCP、UDP和SCTP 2.1 傳輸層的核心作用與協議選型 傳輸層是網絡協議棧中承上啟下的核心層&#xff0c;直接決定應用的通信質量。其主要職責包括&#xff1a; 端到端通信&#xff1a;屏蔽底層網絡細節&am…

Eclipse 創建 Java 類

Eclipse 創建 Java 類 引言 Eclipse 是一款功能強大的集成開發環境(IDE),被廣泛用于 Java 開發。本文將詳細介紹如何在 Eclipse 中創建 Java 類,包括配置開發環境、創建新項目、添加類以及編寫類代碼等步驟。 配置 Eclipse 開發環境 1. 安裝 Eclipse 首先,您需要在您…

汽車安全確認等級-中國等保

1、概念解析 網絡安全保證等級&#xff08;Cybersecurity Assurance Level&#xff09;通常指在不同標準或框架下&#xff0c;根據系統或數據的敏感性、重要性以及潛在風險劃分的等級&#xff0c;用于指導組織采取相應的安全防護措施。以下是幾個常見的網絡安全保證等級體系及…

藍橋杯練習day2:執行操作后的變化量

題意 存在一種僅支持 4 種操作和 1 個變量 X 的編程語言&#xff1a; X 和 X 使變量 X 的值 加 1 –X 和 X-- 使變量 X 的值 減 1 最初&#xff0c;X 的值是 0 給你一個字符串數組 operations &#xff0c;這是由操作組成的一個列表&#xff0c;返回執行所有操作后&#xff…

【機器學習chp14 — 2】生成式模型—變分自編碼器VAE(超詳細分析,易于理解,推導嚴謹,一文就夠了)

目錄 二、變分自編碼器 VAE 1、自編碼器 AE &#xff08;1&#xff09;自編碼器的基本結構與目標 1.1 編碼器-解碼器結構 1.2 目標函數&#xff1a;重構誤差最小化 &#xff08;2&#xff09;自編碼器與 PCA 的對比 2.1 PCA 與線性降維 2.2 非線性映射的優勢 &#xf…

Linux 一步部署DHCP服務

#!/bin/bash #腳本作者和日期 #author: PEI #date: 20250319 #檢查root權限 if [ "$USER" ! "root" ]; then echo "錯誤&#xff1a;非root用戶&#xff0c;權限不足&#xff01;" exit 0 fi #防火墻與高級權限 systemctl stop firewa…

【RHCE】awk文本處理

目錄 基本介紹 命令格式 awk基本使用 命令行讀取程序腳本 數據字段變量 腳本中使用多個命令 文件中讀取程序 處理數據前運行腳本&#xff08;BEGIN&#xff09; 處理數據后運行腳本&#xff08;END&#xff09; awk高級用法 變量 內建變量 自定義變量 數組 定義…

Vue3 核心特性解析:Suspense 與 Teleport 原理深度剖析

Vue3 核心特性解析&#xff1a;Suspense 與 Teleport 原理深度剖析 一、Teleport&#xff1a;突破組件層級的時空傳送 1.1 實現原理圖解 #mermaid-svg-75dTmiektg1XNS13 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-s…

工業界處理 Atomic 操作的優化策略

在產業界&#xff0c;處理 atomic 操作 時&#xff0c;通常會根據具體情境選擇不同的策略&#xff0c;主要取決于以下三個因素&#xff1a; 內存一致性需求&#xff1a;是否需要確保 所有線程&#xff08;threads&#xff09; 都能看到最新的變量值。性能需求&#xff1a;是否…

Python功能完美的寶庫——內置的強大“武器庫”builtins

builtins模塊包含了Python大量的內置對象&#xff08;函數、異常和類型等&#xff09;&#xff0c;她是Python的內置武器庫&#xff0c;堪稱功能完美的寶庫。 筆記模板由python腳本于2025-03-19 08:16:27創建&#xff0c;本篇筆記適合喜歡探究python的coder翻閱。 【學習的細節…

三分鐘掌握視頻分辨率修改 | 在 Rust 中優雅地使用 FFmpeg

前言 在視頻處理領域&#xff0c;調整視頻分辨率是一個繞不過去的需求。比如&#xff0c;你可能需要將一段視頻適配到手機、平板或大屏電視上&#xff0c;或者為了節省存儲空間和網絡帶寬而壓縮視頻尺寸。然而&#xff0c;傳統的FFmpeg命令行工具雖然功能強大&#xff0c;但復…

PyTorch 深度學習實戰(17):Asynchronous Advantage Actor-Critic (A3C) 算法與并行訓練

在上一篇文章中&#xff0c;我們深入探討了 Soft Actor-Critic (SAC) 算法及其在平衡探索與利用方面的優勢。本文將介紹強化學習領域的重要里程碑——Asynchronous Advantage Actor-Critic (A3C) 算法&#xff0c;并展示如何利用 PyTorch 實現并行化訓練來加速學習過程。 一、A…

【深度學習】多目標融合算法(五):定制門控網絡CGC(Customized Gate Control)

目錄 一、引言 二、CGC&#xff08;Customized Gate Control&#xff0c;定制門控網絡&#xff09; 2.1 技術原理 2.2 技術優缺點 2.3 業務代碼實踐 2.3.1 業務場景與建模 2.3.2 模型代碼實現 2.3.3 模型訓練與推理測試 2.3.4 打印模型結構 三、總結 一、引言 上一…

在線pdf處理網站合集

1、PDF24 Tools&#xff1a;https://tools.pdf24.org/zh/ 2、PDF派&#xff1a;https://www.pdfpai.com/ 3、ALL TO ALL&#xff1a;https://www.alltoall.net/ 4、CleverPDF&#xff1a;https://www.cleverpdf.com/cn 5、Doc Small&#xff1a;https://docsmall.com/ 6、Aconv…