探索雙鏈表:C語言中的鏈式結構魔法

目錄

引言

一、雙鏈表基礎

1.1、什么是雙鏈表?

1.2、雙鏈表節點的結構定義

二、雙鏈表的基本操作

2.1、雙鏈表的初始化

2.2、尾插法

2.3、頭插

2.4、判斷雙鏈表是否為空

2.5、尾刪法

2.6、頭刪法

2.7、查找

2.8、雙鏈表在指定位置之前插入

2.9、雙鏈表刪除指定節點

2.10、雙鏈表的銷毀

三、總結

結語


引言

在程序設計中,數據結構扮演著至關重要的角色。鏈表作為一種基礎且強大的數據結構,廣泛應用于需要動態內存管理和高效插入刪除的場景。而雙鏈表作為鏈表的一種拓展,具有雙向遍歷的能力,為我們的算法設計提供了更大的靈活性。本篇博客將帶你深入了解C語言中的雙鏈表,包括其定義、基本操作以及實際應用,讓你在掌握數據結構的同時,提高編程的效率與能力

一、雙鏈表基礎

1.1、什么是雙鏈表?

雙鏈表同單鏈表一樣,是一種線性結構的數據結構,與單鏈表不同的是,雙鏈表的每個節點有兩個指針,分別指向下一個節點和上一個節點。這使得雙鏈表既可以向前遍歷,也可以向后遍歷,極大的節省了時間,但代價就是每個節點所占用的空間變大了。

1.2、雙鏈表節點的結構定義

typedef int DLElemType;
typedef struct DListNode
{DLElemType data;   //節點的數據域struct DListNode* next;   //指向下一個節點struct DListNode* prev;   //指向上一個節點
}DListNode;

二、雙鏈表的基本操作

2.1、雙鏈表的初始化

void DLInit(DListNode** pphead)
{*pphead = (DListNode*)malloc(sizeof(DListNode));if (*pphead == NULL){perror("malloc fail!");exit(1);}(*pphead)->data = 0;(*pphead)->next = (*pphead)->prev = *pphead;
}

這里要注意的是,為了與其他類型的鏈表區分,雙鏈表的初始化讓兩個指針都指向自己

2.2、尾插法

void DLPushBack(DListNode* phead , DLElemType x)
{assert(phead);DListNode* newnode = (DListNode*)malloc(sizeof(DListNode));if (newnode == NULL){perror("malloc fail!");exit(1);}newnode->data = x;newnode->next = phead;newnode->prev = phead->prev;phead->prev->next = newnode;phead->prev = newnode;
}

在單鏈表中,我們要進行尾差就必須遍歷找到最后一個節點,但是在雙鏈表中,我們只需要找到頭結點的prev指向就可以了,非常的方便

2.3、頭插

在此之前,我們需要編寫一個函數來實現新節點的創建,一次來提高效率:

//創建一個新的雙鏈表節點
DListNode* BuyDListNode(DLElemType x)
{DListNode* newnode = (DListNode*)malloc(sizeof(DListNode));if (newnode == NULL){perror("malloc fail!");exit(1);}newnode->data = x;newnode->next = newnode->prev = NULL;return newnode;
}

接下來就是頭插法的實現了

//頭插
void DLTPushFront(DListNode* phead, DLElemType x)
{assert(phead);DListNode* newnode = BuyDListNode(x);newnode->prev = phead;newnode->next = phead->next;phead->next->prev = newnode;phead->next = newnode;
}

2.4、判斷雙鏈表是否為空

//判斷雙鏈表是否為空
bool DLTEmpty(DListNode* phead)
{assert(phead);return phead->next == phead;
}

2.5、尾刪法

void DLTPopBack(DListNode* phead)
{assert(phead && !DLTEmpty(phead));DListNode* pcur = phead->prev;pcur->prev->next = phead;phead->prev = pcur->prev;free(pcur);pcur = NULL;
}

2.6、頭刪法

void DLTPopFront(DListNode* phead)
{assert(phead && !DLTEmpty(phead));DListNode* pcur = phead->next;phead->next = pcur->next;pcur->next->prev = phead;free(pcur);pcur = NULL;
}

2.7、查找

DListNode* DLTFind(DListNode* phead, DLElemType x)
{assert(phead && !DLTEmpty(phead));DListNode* pcur = phead->next;while (pcur != phead){if (pcur->data == x){return pcur;}pcur = pcur->next;}return NULL;
}

2.8、雙鏈表在指定位置之前插入

void DLTInsert(DListNode* pos, DLElemType x)
{assert(pos);DListNode* newnode = BuyDListNode(x);newnode->next = pos;newnode->prev = pos->prev;pos->prev->next = newnode;pos->prev = newnode;
}

2.9、雙鏈表刪除指定節點

void DLTErase(DListNode* pos)
{assert(pos);pos->prev->next = pos->next;pos->next->prev = pos->prev;free(pos);pos = NULL;
}

2.10、雙鏈表的銷毀

void DLTDestory(DListNode** pphead)
{assert(pphead && *pphead);DListNode* pcur = (*pphead)->next;while (pcur != *pphead){DListNode* tmd = pcur->next;free(pcur);pcur = tmd;}free(*pphead);*pphead = NULL;
}

三、總結

掌握了單鏈表,那么掌握雙鏈表也是分分鐘的事,本篇以有哨兵位,循環的雙鏈表為目的編寫的代碼。雙鏈表的實際應用廣泛,例如播放器的歌曲上一首下一首 ,以及網頁的進一步退一步等。雙鏈表非常好掌握,這里就不多贅述了

結語

通過對雙鏈表的系統講解與實踐操作,相信你已經對其核心思想與實現細節有了更深的理解。雙鏈表不僅是數據存儲的利器,更是算法設計中不可或缺的基礎結構。在今后的學習與開發中,靈活運用雙鏈表,將會讓你的代碼更加高效、優雅。希望這篇文章能為你打開鏈式結構世界的大門,助你在編程之路上越走越遠!

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

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

相關文章

HTML5 + CSS3模擬西門慶、武大郎和潘金蓮的精彩520微信聊天,看完我又相信愛情了

今天520了,我用HTML5 CSS3模擬了西門慶、武大郎和潘金蓮的精彩微信聊天,希望你看完以后可以在緊張的工作中,放松一下,開心一下,同時祝你在這個520可以過得開心快樂。 目錄 1 實現思路 1.1 聊天實現素材 1.2 HTML布…

【Linux】Linux了解與基本指令(1)

hello~ 很高興見到大家! 這次帶來的是C中關于Linux基本指令這部分的一些知識點,如果對你有所幫助的話,可否留下你寶貴的三連呢? 個 人 主 頁: 默|笙 文章目錄一、認識Linux二、操作系統(OS)三、基本指令1. 目錄與普通文件1.1 目錄1.2 普通文件2. pwd 與…

dify 學習筆記

目錄 啟動項目 瀏覽器訪問: dify刪除工作流 代碼是開源dify 啟動項目 cd E:\project\qwen\dify-main\docker docker compose up -d 瀏覽器訪問: http://127.0.0.1/apps dify刪除工作流 右下角,三個點,點擊彈出框&#xff0…

【YOLOv8改進 - 特征融合】FCM:特征互補映射模塊 ,通過融合豐富語義信息與精確空間位置信息,增強深度網絡中小目標特征匹配能力

YOLOv8目標檢測創新改進與實戰案例專欄 專欄目錄: YOLOv8有效改進系列及項目實戰目錄 包含卷積,主干 注意力,檢測頭等創新機制 以及 各種目標檢測分割項目實戰案例 專欄鏈接: YOLOv8基礎解析+創新改進+實戰案例 文章目錄 YOLOv8目標檢測創新改進與實戰案例專欄 介紹 摘要 文…

算法訓練營day30 貪心算法④ 重疊問題 452. 用最少數量的箭引爆氣球、435. 無重疊區間 、 763.劃分字母區間

貪心算法的第四篇博客,主要是重疊問題的練習,思路都較為簡單,最后一題可能需要著重思考一下 452. 用最少數量的箭引爆氣球 遍歷數組,如果存在重疊則減少一支箭(不重疊則增加一支箭) 重疊的判定&#xff1a…

Gradio, Streamlit, Dash:AI應用開發的效率之選

在人工智能時代,如何快速將模型原型轉化為交互式應用,是許多開發者面臨的挑戰。Gradio、Streamlit 和 Dash 作為流行的Python框架,各自以其獨特的優勢,幫助我們高效地構建AI應用界面。本文將深入對比這三大框架的優缺點、適用場景…

數學基礎弱能學好大數據技術嗎?

很多同學剛進入大學,一聽到“大數據”“數據分析”這些詞,就覺得必須得是數學大佬才能玩得轉。高數線代概率論,光聽名字就頭大,更別說那些復雜的公式和推導了。但事實真的是這樣嗎?數學不好,就不能學大數據…

子進程信號處理

SIGCHLD 信號詳解??一、信號定義與作用??SIGCHLD? 是 UNIX/Linux 系統中由內核向父進程發送的信號,用于通知子進程的狀態變化(如終止、停止或恢復)?。其主要作用包括:?回收子進程資源?:避免子進程終止后成為僵…

WPF 項目設置應用程序圖標和設置程序集圖標

在 WPF 項目中更改生成的可執行文件(.exe)圖標需要完成兩個關鍵步驟:設置應用程序圖標和設置程序集圖標。以下是詳細操作指南: 第一步:準備圖標文件 準備一個 .ico 格式的圖標文件(必須使用 ICO 格式&…

JMeter壓測黑馬點評優惠券秒殺的配置及請求爆紅問題的解決(詳細圖解)

目錄 一、前言 二、優惠券秒殺壓測配置 三、已配置token但是請求全部爆紅的問題 四、配置JSON斷言后的效果 一、前言 在學習黑馬點評優惠券秒殺功能的壓力測試時,由于老師沒有任何引導而是直接開始測試,所以本博客記錄一下JMeter壓測黑馬點評優惠券秒…

Nginx 運維實戰: 什么是反向代理,如何配置?

在互聯網的龐大架構中,Nginx 作為一款高性能的 Web 服務器和反向代理服務器,發揮著至關重要的作用。其中,反向代理功能更是 Nginx 被廣泛應用的核心原因之一。本文將深入探討什么是反向代理,以及如何在 Nginx 中進行反向代理的配置…

短視第三套多功能主題3.0二開模板蘋果CMS插件重構版

這款短視第三套多功能主題二開模板蘋果CMS插件重構版源碼,基于市面上現有的二開版本進行的重制修正更新。目前已經完美適配新版 4049 以上的蘋果Cms系統,無需擔心因系統版本問題導致的不兼容情況。?主題插件重構后支持一鍵啟動插件自動安裝模板&#xf…

詳解力扣高頻SQL50題之1148. 文章瀏覽 I【入門】

傳送門:1148. 文章瀏覽 I 題目 Views 表: ---------------------- | Column Name | Type | ---------------------- | article_id | int | | author_id | int | | viewer_id | int | | view_date | date | ---------------------- 此表可能會存在重復…

內外網互傳文件 安全、可控、便捷的跨網數據交換

內外網互傳文件 安全、可控、便捷的跨網數據交換破解企業數字化痛點,重新定義文件傳輸標準在數字化轉型浪潮中,企業面臨著前所未有的挑戰:內網系統需要嚴密防護,外網協作又要高效便民。如何在網絡安全與業務效率之間找到完美平衡&…

性能監控裝飾器-python

看項目時,發現一個性能監控裝飾器,感覺挺有意思的。于是借鑒了他的思路,自己重新寫了我認為更簡潔的代碼。作用:可以放在類上和方法上,如果放在類上,則監控所有方法。根據設置的閾值,判斷方法執…

qt常用控件-05

文章目錄qt常用控件-05LineEditTextEditcombo box結語很高興和大家見面,給生活加點impetus!!開啟今天的編程之路!! 今天我們進一步c11中常見的新增表達 作者:?( ‘ω’ )?260 我的專欄:qt&am…

Python進階知識之pandas庫

目錄 一、Series:一維帶標簽的數組 二、DataFrame:二維表格型數據結構 三、Series 的核心操作 四、 DataFrame 的核心操作 五、 索引的特殊用法 六、 loc 與 iloc:DataFrame 的高級查詢 七、綜合案例 一、Series:一維帶標簽…

【GIT】基礎知識及基本應用

很高興為您詳細介紹Git的相關知識。Git是一個分布式版本控制系統,常用于軟件開發中的代碼管理和協作。以下是關于Git的一些基礎知識:1. 安裝和配置安裝:Windows:可以從GitHub下載適用于Windows的安裝包。MacOS:可以通過…

Maven Scope標簽:解鎖Java項目依賴管理的秘密武器

一、Maven 與依賴管理簡介在 Java 項目開發的龐大體系中,Maven 堪稱基石般的存在,發揮著極為關鍵的作用。它遵循 “約定優于配置” 的理念,讓項目的構建過程變得規范有序、結構化且具備良好的重復性 。比如,它強制執行標準的項目結…

IP43半加固筆記本L156H

IP43半加固筆記本L156H 產品特性:● 標配Intel I7-7700HQ 4核8線程處理器 ● 操作系統支持Windows7/10 64bit / Li n u x ● DDR4 16G 高速內存 zui高支持64G ● 全高清顯示面板15.6寸,1920X1080 ● 內置海德射頻模塊SMA接口 ● 工作溫度:…