《數據結構:單鏈表》

“希望就像星星,或許光芒微弱,但永不熄滅。”

博主的個人gitee:https://gitee.com/friend-a188881041351


一.概念與結構

鏈表是一種物理存儲上非連續、非順序的存儲結構,數據元素的順序邏輯是通過鏈表中的指針鏈接次序實現的。

單鏈表由一系列節點組成,每個節點包含兩部分:

  1. 數據部分:存儲實際的數據。

  2. 指針部分:存儲指向下一個節點的指針。

單鏈表的特點是:

  • 每個節點通過指針連接到下一個節點。

  • 除了最后一個節點外,每個節點都有一個后繼節點。

  • 單鏈表的頭節點(頭指針)是鏈表的入口。

二.單鏈表的定義

1.鏈表的組成

鏈表是由節點構成的。鏈表中每個結點都是獨立申請的(即需要插入數據時才去申請?塊結點的空間),我們需要通過指針變量來保存下?個結點位置才能從當前結點找到下?個結點。

2.鏈表的性質

  • 鏈式機構在邏輯上是連續的,在物理結構上不?定連續。
  • 結點?般是從堆上申請的。
  • 從堆上申請來的空間,是按照?定策略分配出來的,每次申請的空間可能連續,可能不連續。

3.單鏈表的定義

typedef int SLTDataType;
typedef struct SListNode 
{SLTDataType data;struct SListNode* next;//指向下一個結點的指針
}SLTNode;

當我們想要保存?個整型數據時,實際是向操作系統申請了一塊內存,這個內存不僅要保存整型數 據,也需要保存下一個結點的地址(當下?個結點為空時保存的地址為空)。

當我們想要從第?個結點走到最后?個結點時,只需要在當前結點拿上下一個結點的地址就可以了。

三.單鏈表的操作(增、刪、查、改)

先在"List.h"中:

//phead:頭(首)結點
void SLTPrint(SLTNode* phead);//尾插
void SLTPushBack(SLTNode** pphead, SLTDataType x);//頭插
void SLTPushFront(SLTNode** pphead, SLTDataType x);//尾刪
void SLTPopBack(SLTNode** pphead);//頭刪
void SLTPopFront(SLTNode** pphead);//查找
SLTNode* SLTFind(SLTNode* phead, SLTDataType x);//在指定位置之前插?數據
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x);//在指定位置之后插?數據
void SLTInsertAfter(SLTNode* pos, SLTDataType x);//刪除pos結點
void SLTErase(SLTNode** pphead, SLTNode* pos);//刪除pos之后的結點
void SLTEraseAfter(SLTNode* pos);//銷毀鏈表
void SListDestroy(SLTNode** pphead);

先寫前置函數方便接下來的代碼編寫:

//向操作系統申請一個新節點
SLTNode* SLTBuyNode(SLTDataType x)
{SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));if (newnode == NULL){perror("malloc fail!");exit(1);}newnode->data = x;newnode->next = NULL;return newnode;
}

1.單鏈表插入元素

a.頭插

void SLTPushFront(SLTNode** pphead, SLTDataType x)
{assert(pphead);SLTNode* newnode = SLTBuyNode(x);newnode->next = *pphead;*pphead = newnode;
}

b.尾插

void SLTPushBack(SLTNode** pphead, SLTDataType x)
{assert(pphead);SLTNode* newnode = SLTBuyNode(x);//鏈表為空,phead直接指向newnode結點if (*pphead == NULL){*pphead = newnode;}else {   //鏈表不為空,找尾結點,將尾結點和新節點連接起來SLTNode* ptail = *pphead;while (ptail->next)//等價于ptail->next != NULL{ptail = ptail->next;}ptail->next = newnode;}
}

c.在指定位置之前插入數據

void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{assert(pphead && pos);//pos就是頭結點if (pos == *pphead){//頭插SLTPushFront(pphead, x);}else {SLTNode* newnode = SLTBuyNode(x);//pos在頭結點之后--->找pos前驅節點SLTNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}//prev newnode  posnewnode->next = pos;prev->next = newnode;}
}

d.在指定位置之后插入數據

void SLTInsertAfter(SLTNode* pos, SLTDataType x)
{assert(pos);SLTNode* newnode = SLTBuyNode(x);newnode->next = pos->next;pos->next = newnode;
}

2.單鏈表刪除元素

a.尾刪

void SLTPopBack(SLTNode** pphead)
{assert(pphead && *pphead);//只有一個結點的情況if ((*pphead)->next == NULL){free(*pphead);*pphead = NULL;}else {SLTNode* prev = NULL;SLTNode* ptail = *pphead;while (ptail->next){prev = ptail;ptail = ptail->next;}//prev ptailprev->next = NULL;free(ptail);ptail = NULL;}
}

b.頭刪

void SLTPopFront(SLTNode** pphead)
{assert(pphead && *pphead);SLTNode* next = (*pphead)->next;free(*pphead);*pphead = next;
}

c.刪除指定位置的數據

void SLTErase(SLTNode** pphead, SLTNode* pos)
{assert(pphead && pos);//要刪除的結點剛好就是頭結點---頭刪if (pos == *pphead){SLTPopFront(pphead);}else {//prevSLTNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}//prev pos pos->nextprev->next = pos->next;free(pos);pos = NULL;}
}

d.刪除指定位置之后的數據

void SLTEraseAfter(SLTNode* pos)
{assert(pos && pos->next);SLTNode* del = pos->next;pos->next = del->next;free(del);del = NULL;
}

3.單鏈表查找元素

SLTNode* SLTFind(SLTNode* phead, SLTDataType x)
{SLTNode* pcur = phead;while (pcur){if (pcur->data == x){return pcur;}pcur = pcur->next;}//未找到return NULL;
}

4.鏈表的銷毀

void SListDestroy(SLTNode** pphead)
{assert(pphead);SLTNode* pcur = *pphead;while (pcur){SLTNode* next = pcur->next;free(pcur);pcur = next;}*pphead = NULL;
}

如有錯誤,懇請指正.

?

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

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

相關文章

藍橋杯 - 中等 - 絕美宋詞

介紹 “今宵酒醒何處,楊柳岸曉風殘月”,“驀然回首,那人卻在燈火闌珊處”,“試問閑愁都幾許?一川煙草,滿城風絮,梅子黃時雨” ...... 宋詞可謂是古代文學桂冠上一顆璀璨的明珠,本題…

JDBC、excute()、DriveManager、Connection、Statement、自建JDBC工具類、占位符

DAY19.2 Java核心基礎 JDBC JDBC:Java database Connectivity JDBC是java程序連接各種數據庫的組件 Mybatis就是基于JDBC的封裝,是獨立于數據庫的管理系統,通用的SQL數據庫存取和操作的公共接口 定義了一套標準,為訪問 不同數…

21天Python計劃:函數簡單介紹

文章目錄 前言一、函數知識體系二、函數基礎函數的定義和調用函數參數 三、函數對象、函數嵌套、名稱空間與作用域、裝飾器函數對象函數嵌套名稱空間與作用域裝飾器 四、迭代器、生成器、面向過程編程迭代器生成器面向過程編程 五、三元表達式、列表推導式、生成器表達式、遞歸…

污水處理廠人員定位方案-UWB免布線高精度定位

1. 方案概述 本方案采用免布線UWB基站與北斗衛星定位融合技術,結合UWBGNSS雙模定位工卡,實現污水處理廠室內外人員高精度定位(亞米級)。系統通過低功耗4G傳輸數據,支持實時位置監控、電子圍欄、聚集預警、軌跡回放等功…

無人機DSP處理器工作要點!

一、DSP處理器在無人機中的工作要點 1. 高效運算架構 哈佛結構:DSP采用程序與數據存儲分離的哈佛結構,允許同時訪問指令和數據,提升數據吞吐效率。 流水線技術:將指令分解為取指、譯碼、執行等多個階段并行處理&#xff0c…

MySQL查詢成本計算

對于如上SQL,只是因為查詢字段不同,最終執行時選擇的索引就不同,那么MySQL是如何決定選擇使用哪個索引呢? 答案是MySQL會進行成本計算,對于各個場景查詢進行成本預估,最終選擇最優。 我們可以使用trace工具…

《K230 從熟悉到...》矩形檢測

《K230 從熟悉到...》矩形檢測 《廬山派 K230 從熟悉到...》矩形檢測 矩形檢測技術是一種廣泛應用于電子圖像處理的核心技術。它通過識別和分析圖像中的矩形結構,為各種應用提供基礎支持。從傳統圖像處理算法到現代深度學習技術,矩形檢測的實現途徑多種多…

python基礎學習三(元組及字符串的使用)

文章目錄 元組什么是元組元組的創建方式為什么要將元組設計成不可變序列元組的遍歷集合集合的相關操作集合操作集合的數學操作集合生成式列表,字典,元組,集合總結 字符串字符串的駐留機制判斷字符串的操作方法字符串的比較操作字符串的切片操…

Java基礎-22-基本語法-實體類

實體類(Entity Class) 1. 什么是實體類? 實體類(Entity Class) 是 Java 中用于表示數據庫表結構或業務對象的類。它通常包含屬性(字段)和getter/setter 方法,用于存儲和操作數據。…

Android 系統ContentProvider流程

一、ContentProvider初始化注冊流程 源碼查看路徑:http://xrefandroid.com/android-11.0.0_r48/ 涉及到源碼文件: /frameworks/base/core/java/android/content/ContentProvider.java 自定義ContentProvider需要繼承該類,內部類Transport繼承關系如下,實…

爬蟲工程師分享自動批量化獲取商品評論數據的方法有哪些?

在電商領域,商品評論數據對于商家了解產品口碑、洞悉用戶需求,以及開展競品分析等工作具有極其重要的價值。作為爬蟲工程師,掌握自動批量化獲取商品評論數據的方法,能極大提升數據收集效率。下面,我將分享一些實用的操…

Vue3組件事件用戶信息卡練習

用戶信息卡 題目要求 實現一個用戶信息卡系統&#xff0c;包含以下功能&#xff1a; 1.父組件收集用戶信息&#xff08;姓名、年齡、班級&#xff09; 2.子組件接收并展示用戶信息卡片 3.添加基本的數據驗證 <!DOCTYPE html> <html lang"en"> <h…

SpringBean模塊(二)bean初始化(2)和容器初始化順序的比較--引入ApplicationContextInitializer

前面介紹了獲取容器可以讓spring bean實現ApplicationContextAware&#xff0c;實際也是初始化執行了setApplicationContext接口&#xff0c; 初始化接口還可以借助一些注解或者spring bean的初始化方法&#xff0c;那么他們的執行順序是什么樣的呢&#xff1f; 一、驗證&…

中小型企業網絡的搭建

1.1 網絡邏輯拓撲、布線方案的設計 1.1.1 網絡設計依據 網絡設計應遵循以下基本原則&#xff1a; 高效性&#xff1a;確保網絡架構能夠支持企業日常業務的高效運行。 可靠性&#xff1a;采用冗余設計&#xff0c;確保網絡的高可用性&#xff0c;避免單點故障。 可擴展性…

angr基礎學習

參考&#xff1a;angr AngrCTF_FITM/筆記/03/Angr_CTF從入門到精通&#xff08;三&#xff09;.md at master ZERO-A-ONE/AngrCTF_FITM angr_explore 00_angr_find IDA分析結果&#xff1a; 邏輯簡單&#xff0c;輸入&#xff0c;complex_function進行加密&#xff0c;加密…

軟考-高級-系統架構設計師【考試備考資料下載】

計算機技術與軟件專業技術資格&#xff08;水平&#xff09;考試是原中國計算機軟件專業技術資格和水平考試的完善與發展。計算機技術與軟件專業技術資格&#xff08;水平&#xff09;考試是由國家人力資源和社會保障部、工業和信息化部領導下的國家級考試。 計算機技術與軟件專…

3. 第三放平臺部署deepseek

有時候我們會發現使用deepseek服務器&#xff0c;異常卡頓&#xff0c;這是由于多方面原因造成的&#xff0c;比如說訪問人數過多等。想要解決這個問題&#xff0c;我們可以選擇第三方平臺進行部署 第三方平臺 我們可以選擇的第三方平臺很多&#xff0c;比如硅基流動、秘塔搜索…

1.4-蜜罐\堡壘機\API接口

1.4-蜜罐\堡壘機\API接口 蜜罐&#xff1a;用來釣魚或誘惑測試人員的防護系統 bash <(curl -sS -L https://hfish.net/webinstall.sh) # 安裝HFISH蜜罐堡壘機&#xff1a; 運維用的&#xff0c;統一管理運維平臺;拿下堡壘機就很有可能等于拿下了多個平臺 jumpServer一鍵安…

知識圖引導的檢索增強生成

摘要 檢索增強生成&#xff08;RAG&#xff09;已經成為一種很有前途的技術&#xff0c;用于解決大型語言模型&#xff08;LLM&#xff09;生成的響應中的幻覺問題。現有的RAG研究主要集中在應用基于語義的方法來提取孤立的相關組塊&#xff0c;忽略了它們之間的內在關系。在本…

【機器學習】imagenet2012 數據預處理數據預處理

【機器學習】數據預處理 1. 下載/解壓數據2. 數據預處理3. 加載以及訓練代碼3.1 使用PIL等加載代碼3.2 使用OpenCV的方式來一張張加載代碼3.3 h5的方式來加載大文件 最后總結 這個數據大約 140個G,128w的訓練集 1. 下載/解壓數據 首先需要下載數據&#xff1a; 數據最后處理…