單鏈表詳解(2)

三、函數定義

查找節點

//查找結點
SLTNode* SLTNodeFind(SLTNode* phead, SLTDataType x)
{assert(phead);SLTNode* pcur = phead;while (pcur){if (pcur->data == x){return pcur;}pcur = pcur->next;}return NULL;
}

查找節點我們是通過看數據域來查找的,查找節點函數的返回值類型是SLTNode* 因為不涉及到鏈表的修改,我們只需要傳值;同樣地,首=首先要斷言看鏈表是否為空;為了方便遍歷鏈表,我們定義一個節點pcur,在循環中沒經歷一個節點時,就拿這個節點地數據域的值和傳入的數據進行比較,直到最后一個幾點,如果某個節點的數據域的值和傳入的值相同,就返回這個節點,若是遍歷完鏈表還是找不到,說明這個鏈表沒有要查找的節點,那么就返回NULL。

相關測試:

?

指定位置之前插入數據

//在指定位置之前插入數據
void SLTInsertFront(SLTNode** pphead,SLTNode* pos, SLTDataType x)
{assert(pphead && *pphead);assert(pos);if (pos == *pphead){SLTPushFront(pphead, x);}else{SLTNode* newnode = SLTBuyNode(x);SLTNode* pre = *pphead;while (pre->next != pos){pre = pre->next;}pre->next = newnode;newnode->next = pos;}
}

?需要配合SLNodeFind一起使用。鏈表不能為空,指定的位置處的節點也不能為空;先看到else中的內容,若是指定的位置不是頭節點,為傳入的數據申請一個新節點,循環找到pos前的節點,讓pre的next指針指向newnode,newnode的next指針指向pos,這樣就讓鏈表多了一個指定位置之前的節點;若是pos就是頭節點此時不能直接走else里面的內容,因為pre找不到,最終會是空,此時直接引用頭插方法。

相關測試:

??指定位置之后插入數據

//在指定位置之后插入數據
void SLTInsertBack(SLTNode* pos, SLTDataType x)
{assert(pos);SLTNode* newnode = SLTBuyNode(x);SLTNode* next = pos->next;pos->next = newnode;newnode->next = next;
}

不需要傳頭節點,因為不需要找到指定位置之前的節點,只需要pos和pos之后的節點,先把pos之后的節點給存起來,再讓pos的next指向newnode,再讓newnode的next指向原鏈表pos之后的節點。

刪除指定位置的節點

//刪除指定位置的數據
void SLTErase(SLTNode** pphead, SLTNode* pos)
{assert(pphead && *pphead);assert(pos);SLTNode* pre = *pphead;SLTNode* next = pos->next;if (pos == *pphead){SLTPopFront(pphead);}else{while (pre->next != pos){pre = pre->next;}free(pos);pos = NULL;pre->next = next;}
}

?同樣地,如果pos就等于*pphead那么直接循環則找不到pre,這個時候直接調用頭刪的函數;若是正常情況下,則先找到pos之前的節點,再釋放pos處的節點,最后讓pre的next指向next的節點(也就是原鏈表中pro的next節點)。

?刪除指定位置之后的節點

//刪除指定位置之后的數據
void SLTEraseAfter(SLTNode* pos)
{assert(pos && pos->next);SLTNode* del = pos->next;pos->next = del->next;free(del);del = NULL;
}

?我們需要找到pos下一個和pos下下個的節點,因為刪除了pos之后的節點之后要讓pos的next指向pos的下下個節點;若是直接先 (pos->next=pos->next->next)再(free(pos->next)),這樣會錯誤地刪除原本鏈表中pos的下下個節點;

為了避免這種錯誤,我們先定義一個del節點存放要刪除的節點,再讓pos的next指向pos的下下個節點,最后刪除del節點,因為此時的del的定義是在改變pos地next之前進行的,所以del代表的就是原鏈表pos的下一個節點并且不會改變,我們此時直接刪除del不會對新鏈表造成破壞,這樣就實現了該函數功能。

銷毀單鏈表

//銷毀單鏈表
void SLTDestroy(SLTNode** pphead)
{assert(pphead && *pphead);SLTNode* pcur = *pphead;//SLTNode* next = NULL;while (pcur){SLTNode* next = pcur->next;free(pcur);pcur = next;}*pphead = NULL;
}

?銷毀單鏈表需要對其節點一個一個釋放;我們對下面這個鏈表進行銷毀并且調試觀察;

?在鏈表尾插完之后在內存中是這樣的:

在進行銷毀的前一刻內存中是這樣的:

銷毀了三次之后:

銷毀完節點并且讓*pphead置為空之后:

?如此就完成了單鏈表的銷毀。

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

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

相關文章

Arm64 基礎指令集介紹

按照字母排序順序: ● ADC:帶進位加法。 ● ADCS:帶進位加法,設置標志位。 ● ADD (extended register):擴展寄存器加法。 ● ADD (immediate):立即數加法。 ● ADD (shifted register):移位寄存…

【MySQL05】【 undo 日志】

文章目錄 一、前言二、undo 日志(回滾日志)1. 事務 id2. undo 日志格式2.1 INSERT 對應的 undo 日志2.2 DELETE 對應的 undo 日志2.3 UPDATE 對應的 undo 日志2.3.1 不更新主鍵2.3.2 更新主鍵 2.3 增刪改操作對二級索引的影響2.4 roll_pointer 3. FIL_PA…

Windows 網絡重置

netsh int ip reset 命令是用于重置 Windows 操作系統中的網絡設置和配置的命令。 在網絡故障排除、修復網絡連接問題以及清除可能存在的網絡配置沖突時非常有用。 命令詳解: netsh: 用于配置各種網絡設置 int: 用于管理網絡接口 ip: 用于管理網絡接口的 IP 配…

layui項目中的layui.define、layui.config以及layui.use的使用

第一步:創建一個layuiTest項目,結構如下 第二步:新建一個test.js,利用layui.define定義一個模塊test,并向外暴露該模塊,該模塊里面有兩個方法method1和method2. 第三步:新建一個test.html,在該頁面引入layui.js&#x…

基于FPGA的LDPC編譯碼算法設計基礎知識

基于FPGA的LDPC編譯碼算法設計基礎知識 數字電路(數電)知識模擬電路(模電)知識1. 放大器1.1. 晶體管放大器1.2. 運算放大器1.3. 管子放大器(真空管放大器)微處理器/單片機知識其他相關知識 基于FPGA的算法設…

neo4j 圖數據庫:Cypher 查詢語言、醫學知識圖譜

neo4j 圖數據庫:Cypher 查詢語言、醫學知識圖譜 Cypher 查詢語言創建數據查詢數據查詢并返回所有節點查詢并返回所有帶有特定標簽的節點查詢特定屬性的節點及其所有關系和關系的另一端節點查詢從名為“小明”的節點到名為“小紅”的節點的路徑 更新數據更新一個節點…

python爬蟲和用騰訊云API接口進行翻譯并存入excel,通過本機的Windows任務計劃程序定時運行Python腳本!

項目場景: 提示:這里簡述項目相關背景:定時爬取外網的某個頁面,并將需要的部分翻譯為中文存入excel 接下了的,沒學過的最好看一下 基本爬蟲的學習 【爬蟲】requests 結合 BeautifulSoup抓取網頁數據_requests beauti…

Vue CoreVideoPlayer 一款基于 vue.js 的輕量級、優秀的視頻播放器組件

大家好,我是程序視點的小二哥!今天小二哥給大家推薦一款非常優秀的視頻播放組件 效果欣賞 介紹 Vue-CoreVideoPlayer 一款基于vue.js的輕量級的視頻播放器插件。 采用Adobd XD進行UI設計,支持移動端適配,不僅功能強大,顏值也是超一流! Vue-…

第一次構建一個對話機器人流程解析(二)

1. 問答機器人的組成-基于知識圖譜的搜索 在教育場景下,若學生有關于學習內容的提問,或業務層面的提問,則要求問答機器人的回答必須精準,來滿足業務的要求因此需要通過知識圖譜來快速檢索,所提內容的相關信息&#xf…

數字系統與進制轉換

數字系統 數字邏輯是計算機科學的基礎,它研究的是如何通過邏輯門電路(與門、或門、非門等)實現各種邏輯功能。數字系統則是由數字邏輯電路組成的系統,可以實現各種復雜的運算和控制功能。在計算機科學中,數字邏輯和數…

C++ 假設今天是星期日,那么過a^b天之后是星期幾?

題目 假設今天是星期日&#xff0c;那么過a^b天之后是星期幾&#xff1f; 【輸入】 兩個正整數a&#xff0c;b&#xff0c;中間用單個空格隔開。0<a≤100,0<b≤10000。 【輸出】 一個字符串&#xff0c;代表過a^b天之后是星期幾。 其中&#xff0c;Monday是星期一&…

自定義波形圖View,LayoutInflater動態加載控件保存為本地圖片

效果圖: 頁面布局: <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="…

C#多線程并行計算實例

在C#中實現多線程并行計算可以通過使用 Task 和 Parallel 類來實現。這里給出兩個簡單的示例&#xff0c;一個是使用 Task&#xff0c;另一個是使用 Parallel.ForEach。 使用 Task 進行多線程并行計算 using System; using System.Threading.Tasks;class Program {static voi…

Kubernetes基于helm部署jenkins

Kubernetes基于helm安裝jenkins jenkins支持war包、docker鏡像、系統安裝包、helm安裝等。在Kubernetes上使用Helm安裝Jenkins可以簡化安裝和管理Jenkins的過程。同時借助Kubernetes&#xff0c;jenkins可以實現工作節點的動態調用伸縮&#xff0c;更好的提高資源利用率。通過…

MySQL Innodb存儲引擎中,當頁默認的大小是16K時,頁中最多存放多少行的記錄?

1、題目引入 Innodb存儲引擎是面向行的(row-oriented)&#xff0c;也就是說數據的存放按行進行&#xff0c;每頁存放的行記錄是有硬性定義的&#xff0c;當頁默認的大小是16K時&#xff0c;頁中最多存放多少行的記錄&#xff1f; A、1600 行B、8192 行C、16383 行D、7992 行 …

基于Python協同過濾的旅游景點推薦系統,采用Django框架,MySQL數據存儲,Bootstrap前端,echarts可視化實現

隨著旅游業的迅速發展&#xff0c;個性化旅游推薦系統成為提升用戶體驗和促進旅游市場增長的重要工具。本研究旨在設計并實現一種基于Python協同過濾的旅游景點推薦系統&#xff0c;結合Django框架、MySQL數據庫存儲、Bootstrap前端框架以及echarts數據可視化技術&#xff0c;為…

Flask發布一個及時止損(止盈)服務(二)

生成可視化的止盈止損結果&#xff08;圖片&#xff09; 媽的&#xff0c;還是得用 akshare&#xff0c;還需要指定python版本3.9以上 conda remove -n fonxsys --all conda search pythonconda create -n fonxsys python3.9 conda activate fonxsys python.exe -m pip insta…

【粉絲福利 | 第8期】值得收藏!推薦10個好用的數據血緣工具

?? 寫在前面參與規則&#xff01;&#xff01;&#xff01; ?參與方式&#xff1a;關注博主、點贊、收藏、評論&#xff0c;任意評論&#xff08;每人最多評論三次&#xff09; ??本次送書1~4本【取決于閱讀量&#xff0c;閱讀量越多&#xff0c;送的越多】 目前市面上絕…

數據遷移探索

概念 數據遷移是指將數據從一個計算環境或存儲系統移動到另一個計算環境或存儲系統。 隨著公司業務的發展&#xff0c;出于成本優化、系統升級、分庫分表、整合數據等原因。數據遷移工作在日常工作中會陸續出現。 我們可以將數據遷移分成兩個部分&#xff0c;第一部分是數據…

springboot高職院校畢業生信息管理系統-計算機畢業設計源碼27889

摘 要 基于Java語言開發的高職院校畢業生信息管理系統旨在提供一個便捷、高效的方式來管理畢業生的相關信息。系統包括學生基本信息管理、成績管理、就業信息管理等模塊&#xff0c;通過界面友好、操作簡單的設計&#xff0c;方便管理員快速查詢和更新學生信息。系統還提供數據…