[數據結構] -- 雙向循環鏈表

?🌈 個人主頁:白子寰
🔥 分類專欄:C++打怪之路,python從入門到精通,數據結構,C語言,C語言題集👈 希望得到您的訂閱和支持~
💡 堅持創作博文(平均質量分82+),分享更多關于深度學習、C/C++,python領域的優質內容!(希望得到您的關注~)

?

目錄

雙向循環鏈表

結構

介紹

圖示

雙向鏈表的實現

在List.h中

定義雙向鏈表的結構

實現雙向鏈表的接口/方法

?在List.c中

初始化

銷毀鏈表

打印鏈表

判斷鏈表是否為空

尾插

測試

頭插

測試

?編輯尾刪

測試

?編輯頭刪

測試

?編輯在pos位置之后插入數據

測試

?編輯刪除pos指定節點

測試

查找鏈表的指定元素


雙向循環鏈表

結構

包含數據域,指針域(前驅節點prev和后繼節點next)


介紹

結構最復雜,一般用在單獨存儲數據。

實際中使用的鏈表數據結構,都是帶頭雙向循環鏈表。

另外這個結構雖然結構復雜,

但是使用代碼實現以后會發現結構會帶來很多優勢,但實現簡單


圖示



雙向鏈表的實現

在List.h中

定義雙向鏈表的結構

typedef int LTDataType;
typedef struct ListNode
{LTDataType data;struct ListNode* prev;struct ListNode* next;
}LTNode;

?

實現雙向鏈表的接口/方法

//初始化
LTNode* LTInit();
//銷毀鏈表
void LTDestroy(LTNode* phead);
//打印鏈表
void LTPrint(LTNode* phead);
//判斷鏈表是否為空
bool LTEmpty(LTNode* phead);
//尾插
void LTPushBack(LTNode* phead, LTDataType x);
//頭插
void LTPushFront(LTNode* phead, LTDataType x);
//尾刪
void LTPopBack(LTNode* phead);
//頭刪
void LTPopFront(LTNode* phead);
//在pos位置之后插入數據
void LTInsert(LTNode* pos, LTDataType x);
//刪除pos指定節點
void LTErase(LTNode* pos);
//查找鏈表的指定元素
LTNode* LTFind(LTNode* phead, LTDataType x);


?

?在List.c中

初始化

//初始化
LTNode* LTInit()
{LTNode* phead = LTBuyNode(-1);return phead;
}


銷毀鏈表

//銷毀
void LTDestroy(LTNode* phead)
{assert(phead);LTNode* pcur = phead->next;while (pcur != phead){LTNode* next = pcur->next;free(pcur);pcur = next;}//最后釋放頭節點的內存并置空free(phead);phead = NULL;
}


打印鏈表

//打印雙向鏈表
void LTPrint(LTNode* phead)
{assert(phead);LTNode* pcur = phead->next;while (pcur != phead){printf("%d->", pcur->data);pcur = pcur->next;}printf("\n");
}


判斷鏈表是否為空

bool LTEmpty(LTNode* phead)
{if (phead->next == phead){return true;}else { return false; }
}


尾插

//尾插
void LTPushBack(LTNode* phead, LTDataType x)
{assert(phead);LTNode* newnode = LTBuyNode(x);newnode->next = phead;newnode->prev = phead->prev;phead->prev->next = newnode;phead->prev = newnode;
}

后四行的方向和賦值問題?

有新開節點newnode

?

測試



頭插

//頭插
void LTPushFront(LTNode* phead, LTDataType x)
{assert(phead);LTNode* newnode = LTBuyNode(x);LTNode* pcur = phead->next;newnode->next = pcur;newnode->prev = phead;phead->next = newnode;pcur->prev = newnode;
}
測試



尾刪

//尾刪
void LTPopBack(LTNode* phead)
{assert(phead);LTNode* p1 = phead->prev;LTNode* pcur = p1->prev;pcur->next = phead;phead->prev = pcur;free(p1);p1 = NULL;
}
測試



頭刪

//頭刪
void LTPopFront(LTNode* phead)
{assert(phead);LTNode* pcur = phead->next->next;LTNode* p1 = phead->next;phead->next = pcur;pcur->prev = phead;free(p1);p1 = NULL;
}
測試



在pos位置之后插入數據

//在pos位置之后插入數據
void LTInsert(LTNode* pos, LTDataType x)
{assert(pos);LTNode* newnode = LTBuyNode(x);newnode->next = pos->next;newnode->prev = pos;//如果pos是最后一個節點if (pos->next == NULL){newnode->next = NULL;}else{pos->next->prev = newnode;}pos->next = newnode;
}
測試



刪除pos指定節點

//刪除pos節點
void LTErase(LTNode* pos)
{assert(pos);LTNode* p1 = pos->prev;LTNode* pcur = pos->next;p1->next = pcur;pcur->prev = p1;free(pos);pos = NULL;
}
測試



查找鏈表的指定元素

//查找元素
LTNode* LTFind(LTNode* phead, LTDataType x)
{assert(phead);LTNode* pcur = phead->next;while (pcur != phead)    //注意循環條件!{if (pcur->data == x){return pcur;}else{pcur = pcur->next;}}return NULL;
}


?

?

?***********************************************************分割線*****************************************************************************
完結!!!
感謝瀏覽和閱讀。

等等等等一下,分享最近喜歡的一句話:

“人生如逆旅,我亦是行人”。

我是白子寰,如果你喜歡我的作品,不妨你留個點贊+關注讓我知道你曾來過。
你的點贊和關注是我持續寫作的動力!!!?
好了劃走吧。

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

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

相關文章

一文理清database/sql包的使用場景和宕機查詢流程

一文理清database/sql包你可能遇到的問題 那么database/sql包實現了什么功能呢?建立數據庫連接檢測連接是否能ping通通過連接進行具體的sql查詢查詢完將連接進行關閉當數據庫宕掉重啟后再次查詢 database/sql包創建的db連接 對于數據庫宕掉后重啟是否仍然有效&#…

AI繪畫工具:創意與技術的完美融合

隨著人工智能技術的飛速發展,我們見證了無數領域的革新與變革。其中,AI繪畫工具的出現,無疑為藝術界帶來了一股清新的風潮。這些工具以其獨特的魅力,吸引了無數藝術家和創意人士的目光,成為他們表達自我、探索未知的重…

Compose在xml中使用滑動沖突處理

一、背景 在現有Android項目中使用Compose可能存在滑動沖突問題,例如 SmartRefreshLayoutCoordinatorLayoutComposeView(ComposeView這里又是一個LazyColumn) 二、解決方案 官方介紹:https://developer.android.google.cn/develop/ui/compose/touch-inp…

huggingface 筆記:device_map

1 基本映射方法 設計設備映射時,可以讓Accelerate庫來處理設備映射的計算通過設置device_map為支持的選項之一("auto"、 "balanced"、 "balanced_low_0"、 "sequential");或者如果想更精…

golang的context和chan 的使用

1. context 作用 context包的context的接口,主要是控制協程執行上下文的時間,以及取消程序的執行,以及上下文中傳遞數據等作用,golang中耗時或者需要協同的操作都會見到context的身影。 context有幾個常用的方法 1.1 context.B…

用爬山算法解決離散的優化問題

爬山算法,也稱為梯度上升算法或局部搜索算法,是一種簡單有效的優化算法,常用于解決連續或離散的優化問題。爬山算法的基本思想是從一個隨機的初始點開始,通過迭代地向局部最優的方向移動,逐步逼近全局最優解。 爬山算…

git管理Codeup云效平臺

HTTPS方式實現Git命令 1.進入項目路徑,如 cd demo,與此同時,在Codeup平臺創建一個空倉庫repo,獲取空倉庫的https協議地址,例如 https://codeup.aliyun.com/xxxx/xxxx/xxx.git。 2.在demo項目下執行 git init命令初始化…

從反向傳播(BP)到BPTT:詳細數學推導【原理理解】

從反向傳播到BPTT:詳細推導與問題解析 在本文中,我們將從反向傳播算法開始,詳細推導出反向傳播通過時間(Backpropagation Through Time, BPTT)算法。重點討論BPTT中的梯度消失和梯度爆炸問題,并解釋如何解…

采用LoRA方法微調llama3大語言模型

文章目錄 前言一、Llama3模型簡介1.下載llama3源碼到linux服務器2.安裝依賴3.測試預訓練模型Meta-Llama-3-8B4.測試指令微調模型Meta-Llama3-8B-Instruct5.小結 二、LoRA微調Llama31.引入庫2.編寫配置文件3.LoRA訓練的產物 三、測試新模型效果1.編寫配置文件2.運行配置文件&…

QT教程-一,初識QT

目錄 一,QT是什么?能夠使用它做什么? 二,Qt 能夠使用的語言 三,Qt主要用于什么領域? 四,Qt開發的軟件 一,QT是什么?能夠使用它做什么? Qt是一個跨平臺的 C 開發庫,主…

全球最高點贊記錄,世界點贊第一名是誰?世界點贊第一人名字的由來

世界點贊第一人名字的由來: 起源與概念提出: 二十一世紀東方偉大的思想家哲學家教育家顏廷利教授,一位在中國21世紀早期便以其非凡才華和創新精神著稱的學者,早在互聯網尚未普及的20世紀90年代,就已經提出了“點贊”的…

算法提高之最大數

算法提高之最大數 核心思想&#xff1a;線段樹 添加數 看作原本的數組有數(0) 現在將他修改成另一個值 詢問后l個數的最大值query函數具體實現 #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N 200010;typed…

python爬蟲登錄到海康相機管理頁面

簡述 1.最近接到個任務是在管理頁面更改相機的某個參數&#xff0c;下載官方的sdk貌似沒有提供這個接口&#xff0c;所以只能自己寫爬蟲登錄發請求了。 1.主要步驟 1.1 發送get請求獲取到salt&#xff0c;sessionID&#xff0c;challenge等信息 http://admin:123456192.168.…

交叉熵損失函數計算過程(tensorflow)

交叉熵損失函數通常用于多類分類損失函數計算。計算公式如下&#xff1a; P為真實值&#xff0c;Q為預測值。 使用tensorflow計算 import tensorflow as tf import keras# 創建一個示例數據集 # 假設有3個樣本&#xff0c;每個樣本有4個特征&#xff0c;共2個類別 # 目標標簽…

Spark Client 配置

前言 記錄Spark Client 配置,這里的 Spark Client 和 HDFS、YARN 不在一個節點,只是一個單節點的 Spark Client,需要能連接其他節點的大數據集群的 Hive 和 能提交到Yarn 。 環境信息 大數據節點(已配置好Spark): 192.168.44.154 192.168.44.155 192.168.44.156 客戶端…

P2P 技術:點對點網絡的興起

目錄 概述 P2P 的興起 P2P 的定義和特征 定義 特征 P2P 的發展 早期發展 快速成長 成熟應用 P2P 的關鍵技術 P2P 的應用 總結 概述 P2P&#xff08;Peer-to-Peer&#xff09;&#xff0c;即點對點網絡&#xff0c;是一種去中心化的網絡架構&#xff0c;它允許網絡中…

2024最新私有化部署AI大模型,讓每個人都有屬于自己的AI助理

讓每個人都擁有一個屬于自己的本地大模型 下載Ollama 下載地址 ? https://ollama.com/download ? Ollama支持MacOS、Linux、Windows 解壓 下載完成后&#xff0c;會得到一個Ollama-darwin.zip文件&#xff0c;解壓后&#xff0c;以Mac為例是一個可運行文件&#xff1a;O…

Jupyter 使用手冊: 探索交互式計算的無限可能

什么是 Jupyter? Jupyter 是一個開源的 Web 應用程序,可用于創建和共享包含實時代碼、可視化和敘述性文本的文檔。它最初是作為 IPython 項目的一部分開發的,后來發展成為支持多種編程語言的交互式計算環境。 應用場景 作為一個開源的交互式計算環境,Jupyter 在以下幾個領域…

AI應用案例:服務器智能分析管理系統

服務器硬件配置、性能狀態、所運行的應用系統等信息分散于多個不同的信息管理系統。人為查詢判斷現有的服務器資源是否滿足用戶需求&#xff0c;且需結合資產管理系統與Maximo基礎資源、性能監控、運維管理等各個系統互不關聯&#xff0c;數據分散不能為運維管理提供完整一致的…

在Spring 當中存在的八大模式

在Spring 當中存在的八大模式 文章目錄 在Spring 當中存在的八大模式每博一文案1. 簡單工廠模式2. 工廠方法模式3. 單例模式4. 代理模式5. 裝飾器模式6. 觀察者模式7. 策略模式8. 模板方法模式最后&#xff1a; 每博一文案 我認為 “知世故而不世故” 才是真正意義上的成熟。回…