[數據結構] -- 單鏈表

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

?

目錄

鏈表

概念

結構

鏈表的分類

單向鏈表和雙向鏈表

?帶頭(哨兵位)?或 不帶頭(哨兵位) 鏈表

順序表和鏈表的優缺點

在SList.h文件中

定義單鏈表的結構

實現單鏈表的接口/方法

在SList.c文件中?

打印單鏈表(遍歷鏈表)

開辟空間

開辟空間molloc返回值問題

尾部插入元素

傳參的時候為什么要傳二級指針??

測試尾插?

頭部插入元素?

測試?

尾部刪除元素?

測試?

頭部刪除元素?

測試?

查找元素?

?在指定位置之前插入數據

測試?

刪除pos節點?

測試?

在指定位置之后插入數據

刪除pos之后的節點?

測試?

銷毀鏈表?




鏈表

概念

鏈表是一種物理存儲結構上非連續、非順序的存儲結構,

數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的,


單鏈表一般不會單獨使用,
只有頭插和頭刪實現簡單且效率高

結構

鏈表也屬于線性表,線性表在物理上存儲時,
通常以數組(順序表)和鏈式結構(鏈表)的形式存儲,
鏈式結構在邏輯上是連續的,但在物理上不一定連續
? ? ? ? ? ? ? ? ?
現實中的結點一般是從堆上申請出來的
? ? ? ? ? ? ??
從堆上申請的空間,是按照一定的策略來分配的,
兩次申請的空間可能連續,也可能不連續


鏈表的分類

單向鏈表和雙向鏈表

單向鏈表(常用)

雙向鏈表?

?


?帶頭(哨兵位)?或 不帶頭(哨兵位) 鏈表

?帶頭(哨兵位) 鏈表

不帶頭(哨兵位) 鏈表


循環鏈表

?

帶頭雙向循環鏈表(常用)

?



順序表和鏈表的優缺點

順序表鏈表
存儲空間物理上一定連續邏輯上連續,物理上不一定連續
訪問隨機訪問不支持隨機訪問
任意位置插入或刪除元素效率低修改指針指向
應用空間不夠擴容,元素高效存儲,隨機訪問分節點,開節點,可以在任意位置插入或刪除

?



在SList.h文件中

定義單鏈表的結構

typedef int SLTDataType;
typedef struct SListNode
{SLTDataType data;		//數據struct SListNode* next; //指針域next
}SLTNode;

?

實現單鏈表的接口/方法

//打印鏈表
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);
//刪除pos節點
void SLTErase(SLTNode** pphead, SLTNode* pos);
//在指定位置之后插入數據
void SLTInsertAfter(SLTNode* pos, SLTDataType x);
//刪除pos之后的節點
void SLTEraseAfter(SLTNode* pos);
//銷毀鏈表
void SListDesTroy(SLTNode** pphead);


?

在SList.c文件中?

打印單鏈表(遍歷鏈表)

//SLTNode*,表示 phead 是一個指向 SLTNode 類型的指針。
void SLTPrint(SLTNode* phead)		//接收一個指向鏈表頭節點的指針 phead 作為參數
{//一級指針SLTNode* pcur = phead;while (pcur){printf("%d->", pcur->data);pcur = pcur->next;}printf("NULL");printf("\n");
}

?

開辟空間

//開辟空間
SLTNode* SLTBuyNode(SLTDataType x)
{//為一個 SLTNode 類型的結構體分配內存,以便訪問和操作這個新分配的 SLTNode 結構體//所以返回值為SLTNnode*SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));if (newnode == NULL){perror("malloc");exit(1);}newnode->data = x;newnode->next = NULL;return newnode;
}

開辟空間molloc返回值問題

函數原型:

?

?

?


尾部插入元素

//尾部插入元素
void SLTPushBack(SLTNode** pphead, SLTDataType x)
{assert(pphead);SLTNode* newnode = SLTBuyNode(x);//頭結點為空if (*pphead == NULL){*pphead = newnode;return;}//頭結點不為空SLTNode* ptail = *pphead;while (ptail->next){ptail = ptail->next;}ptail->next = newnode;
}

傳參的時候為什么要傳二級指針??

二級指針,在函數內部修改頭指針本身的值

一級指針,用于遍歷和訪問鏈表

以下的 打印鏈表和銷毀鏈表函數 說明一級和二級指針的意思?

測試尾插?


?

頭部插入元素?

//頭部插入元素?
void SLTPushFront(SLTNode** pphead, SLTDataType x)
{assert(pphead);SLTNode* newnode = SLTBuyNode(x);newnode->next = *pphead;	// *pphead表示頭結點*pphead = newnode;
}

測試?


?

尾部刪除元素?

free作用:

①free(ptail);之后,ptail指針本身的值并未改變,但它所指向的內存已經被釋放,因此不應該再使? 用這個指針訪問已經被釋放的內存。

②我們只需要確保不要再使用這個指針來訪問內存,而不必將其置為NULL

//尾部刪除元素?
void SLTPopBack(SLTNode** pphead)
{assert(pphead);assert(*pphead);	//保證頭結點不為空if ((*pphead)->next == NULL){free(*pphead);*pphead = NULL;return;}//有多個結點SLTNode* ptail = *pphead;SLTNode* prev = NULL;while (ptail->next){prev = ptail;ptail = ptail->next;}//單鏈表最后一個結點,只有數據域data且指針域的值是NULL// 釋放尾節點的內存free(ptail);// 將尾節點的前驅節點的next置為NULL,實現刪除尾節點 prev->next = NULL;
}

測試?

頭部刪除元素?

void SLTPopFront(SLTNode** pphead)
{assert(pphead);assert(*pphead);	//保證頭結點不為空SLTNode* next = (*pphead)->next;free(*pphead);*pphead = next;
}

測試?

查找元素?

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

?在指定位置之前插入數據

//在指定位置之前插入數據
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{assert(pphead);assert(*pphead);assert(pos);SLTNode* newnode = SLTBuyNode(x);//pos剛好是頭節點if (newnode->next == *pphead){SLTPushBack(pphead, x);return;}//pos剛好不是頭節點SLTNode* pcur = *pphead;while (pcur->next != pos){pcur = pcur->next;}pcur->next = newnode;newnode->next = pos;
}

測試?

刪除pos節點?

//刪除pos節點
void SLTErase(SLTNode** pphead, SLTNode* pos)
{assert(pphead);assert(*pphead);assert(pos);//剛好是頭節點if (pos == *pphead){SLTPopFront(pphead);return;}//不是頭節點SLTNode* pcur = *pphead;while (pcur->next != pos){pcur = pcur->next;}pcur->next = pos->next;free(pos);pos = NULL;
}

測試?

在指定位置之后插入數據

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

?

刪除pos之后的節點?

//刪除pos之后的節點
void SLTEraseAfter(SLTNode* pos)
{assert(pos);SLTNode* p1 = pos->next;SLTNode* pcur = pos->next->next;pos->next = pcur;free(p1);p1 = NULL;
}

測試?

?

銷毀鏈表?

//銷毀鏈表
//SLTNode**,表示 pphead 是一個指向 SLTNode* 類型的指針的指針
void SListDesTroy(SLTNode** pphead)
{/*  pphead:(二級指針)*/assert(pphead);//一級指針assert(*pphead);//頭結點不為空,鏈表不為空SLTNode* pcur = *pphead;	//*pphead 是頭指針本身(一級指針),用于遍歷和訪問鏈表//先釋放,后置空while (pcur){SLTNode* next = pcur->next;free(pcur);pcur = next;}*pphead = NULL;
}


?

?

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

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

“迷失的時候,選擇更艱辛的那條路”。

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

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

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

相關文章

c++編程14——STL(3)list

歡迎來到博主的專欄:c編程 博主ID:代碼小豪 文章目錄 list成員類型構造、析構、與賦值iterator元素訪問修改元素list的操作 list list的數據結構是一個鏈表,準確的說應該是一個雙向鏈表。這是一個雙向鏈表的節點結構: list的使用…

Vue學習筆記3——事件處理

事件處理 1、事件處理器(1)內聯事件處理器(2)方法事件處理器 2、事件參數3、事件修飾符 1、事件處理器 我們可以使用v-on 指令(簡寫為)來監聽DOM事件,并在事件觸發時執行對應的JavaScript。 用法: v-on:click"me…

JVM學習-執行引擎

執行引擎 執行引擎是Java虛擬機核心組成部分之一虛擬機是一個相對于物理機的概念,這兩種機器都有代碼執行能力,其區別是物理機的執行引擎是直接建立在處理器、緩存、指令集和操作系統層面上的,而虛擬機的執行引擎是由軟件自行實現的&#xf…

【算法】遞歸、搜索與回溯——簡介

簡介:遞歸、搜索與回溯,本節博客主要是簡單記錄一下關于“遞歸、搜索與回溯”的相關簡單概念,為后續算法做鋪墊。 目錄 1.遞歸1.1遞歸概念2.2遞歸意義2.3學習遞歸2.4寫遞歸代碼步驟 2.搜索3.回溯與剪枝 遞歸、搜索、回溯的關系: …

ICML2024 定義新隱私保護升級:DP-BITFIT新型微調技術讓AI模型學習更安全

DeepVisionary 每日深度學習前沿科技推送&頂會論文分享,與你一起了解前沿深度學習信息! 引言:差分隱私在大模型微調中的重要性和挑戰 在當今的深度學習領域,大型預訓練模型的微調已成為提高各種任務性能的關鍵技術。然而&am…

推特熱帖:大語言模型自薦能夠替代的20種人類工作!快來看你是否需要轉行!

最近推特上有一個例子引起了廣泛的討論,事情的起因是這樣的:網友讓 GPT-4o 預測一下自己未來將會替代人類哪些工作? 這聽起來很有趣!GPT-4o會給出什么樣的預測呢? 3.5研究測試:hujiaoai.cn 4研究測試&…

02-Linux【基礎篇】

一、Linux的目錄結構 1.基本介紹 Linux的文件系統采用層級式的樹狀目錄結構,在此結構中的最上層是根目錄"/",然后在此目錄下再創建其他的目錄 深刻理解Linux樹狀文件目錄是非常重要的 記住一句經典的話:在Linux世界里&#xff…

如何在 DigitalOcean Droplet 云主機上創建 Ubuntu 服務器

在本文中,你將通過 DigitalOcean 的管理面板創建一個 Ubuntu 服務器,并將其配置為使用你的 SSH 密鑰。設置好服務器后,你可以在其上部署應用程序和網站。 本教程是DigitalOcean云課程簡介的一部分,它指導用戶完成將應用程序安全地…

win10右鍵沒有默認打開方式的選項的處理方法

問題描述 搞了幾個PDF書籍學習一下,不過我不想用默認的WPS打開,因為WPS太惡心人了,占用資源又高。我下載了個Sumatra PDF,這時候我像更改pdf文件默認的打開程序,發現右擊沒有這個選項。 問題解決 右擊文件–屬性–…

汽車以太網發展現狀及挑戰

一、汽車以太網技術聯盟 目前推動汽車以太網技術應用與發展的組織包括:OPEN Alliance(One-Pair Ether-Net Alliance SIG)聯盟,主要致力于汽車以太網推廣與使用,該聯盟通過推進 BroadR- Reach 單對非屏蔽雙絞線以太網傳…

設計新境界:大數據賦能UI的創新美學

設計新境界:大數據賦能UI的創新美學 引言 隨著大數據技術的蓬勃發展,它已成為推動UI設計創新的重要力量。大數據不僅為界面設計提供了豐富的數據資源,還賦予了設計師以全新的視角和工具來探索美學的新境界。本文將探討大數據如何賦能UI設計…

面試八股之JVM篇3.5——垃圾回收——G1垃圾回收器

🌈hello,你好鴨,我是Ethan,一名不斷學習的碼農,很高興你能來閱讀。 ??目前博客主要更新Java系列、項目案例、計算機必學四件套等。 🏃人生之義,在于追求,不在成敗,勤通…

1688. 比賽中的配對次數

題目: 給你一個整數 n ,表示比賽中的隊伍數。比賽遵循一種獨特的賽制: 如果當前隊伍數是 偶數 ,那么每支隊伍都會與另一支隊伍配對。總共進行 n / 2 場比賽,且產生 n / 2 支隊伍進入下一輪。 如果當前隊伍數為 奇數 …

python梯度下降法求解三元線性回歸系數,并繪制結果

import numpy as np import matplotlib.pyplot as plt # 生成隨機數據 np.random.seed(0) X1 2 * np.random.rand(100, 1) X2 3 * np.random.rand(100, 1) X3 4 * np.random.rand(100, 1) y 4 3 * X1 5 * X2 2 * X3 np.random.randn(100, 1) # 合并特征 X_b np.hsta…

Vue中組件之間的通信有哪些方法

在Vue中,組件之間的通信有多種方法,以下是一些常見的方法: Props和$emit: 父組件通過props向子組件傳遞數據。子組件通過$emit觸發事件,將數據傳遞給父組件。 provide和inject: 在Vue 2.2.0版本中引入的選…

云計算-特殊機制(Specialsed Mechanisms)

自動擴展監聽器 (Automated Scaling Listener) 自動擴展監聽器是一種特定類型的服務代理。它運行在云提供商的網絡中,監控云消費者和云服務之間的網絡流量。通過分析消費者和服務之間的消息量和類型,它可以測量云服務的負載。 自動擴展監聽器對變化的負載…

常見 JVM 面試題補充

原文地址 : 26 福利:常見 JVM 面試題補充 (lianglianglee.com) CMS 是老年代垃圾回收器? 初步印象是,但實際上不是。根據 CMS 的各個收集過程,它其實是一個涉及年輕代和老年代的綜合性垃圾回收器。在很多文章和書籍的劃分中&…

SpringCloud Alibaba的相關組件的簡介及其使用

Spring Cloud Alibaba是阿里巴巴為開發者提供的一套微服務解決方案,它基于Spring Cloud項目,提供了一系列功能強大的組件,包括服務注冊與發現、配置中心、熔斷與限流、消息隊列等。 本文將對Spring Cloud Alibaba的相關組件進行簡介&#xff…

React Native 之 動畫Animated(十二)

react-native 的 Animated API提供了一種聲明式的方式來創建平滑的動畫效果。它允許你編寫動畫邏輯,并將動畫值直接綁定到組件的樣式或布局屬性上。 react-native 的 Animated 庫通過以下方式工作: 創建動畫值:首先,你需要使用 A…

ROCm上運行預訓練BERT

14.10. 預訓練BERT — 動手學深度學習 2.0.0 documentation (d2l.ai) 下載數據集 在d2l-zh/pytorch/data目錄解壓: ~/d2l-zh/pytorch/data$ unzip wikitext-2-v1.zip Archive: wikitext-2-v1.zipcreating: wikitext-2/inflating: wikitext-2/wiki.test.tokens …