帶頭結點 的單鏈表插入方法(頭插法與尾插法)

帶頭結點的單鏈表插入方法(頭插法與尾插法)

在這里插入圖片描述

在單鏈表的操作中,插入是最常見的操作之一,本文介紹 帶頭結點的單鏈表 如何實現 后插法前插法(包括 插入法后插數據交換法),并提供完整的 C++ 代碼示例。


1. 鏈表的基本結構

帶頭結點 的單鏈表中,頭結點 L 僅作為占位符,不存儲數據,鏈表的數據從 L->next 開始。

#include <stdio.h>
#include <stdlib.h>typedef struct Node {int data;struct Node* next;
} Node, *List;
  • data:存儲節點數據。
  • next:指向下一個節點的指針。
  • List:定義指向 Node 的指針類型,表示鏈表。

2. 鏈表初始化

bool Init(List &L) {L = (Node *)malloc(sizeof(Node));  // 創建頭結點L->next = NULL;return true;
}
  • L 作為頭結點,僅占位,不存儲數據。
  • L->next = NULL 表示鏈表為空。

3. 后插法(在指定位置后插入)

3.1 后插法介紹

后插法 是指在 某個指定位置 i 之后 插入新的節點,即:

原鏈表: A -> B -> C -> NULL
插入后: A -> B -> X -> C -> NULL (X 插入到 B 之后)

3.2 后插法代碼

bool Insert(List &L, int i, int value) {Node *p = L;  // p 指向頭節點int j = 0;// 找到 i-1 位置的節點while (p != NULL && j < i - 1) {  p = p->next;  j++;}if (p == NULL) { // 如果 i 超出鏈表長度,插入失敗return false;}// 創建新節點Node *s = (Node *)malloc(sizeof(Node));s->data = value;// 插入s->next = p->next;p->next = s;return true;
}

3.3 代碼解析

  1. 找到 i-1 位置的節點
    • 通過 while 循環找到第 i-1 個節點 p,使 p->next 指向新節點。
  2. 創建新節點 s
    • 分配內存,存入 value
  3. 新節點 s 指向 p->next
    • s->next = p->next,讓新節點連接到 p 的下一個節點。
  4. p 連接到 s
    • p->next = s,完成插入。

3.4 運行示例

void PrintList(List L) {Node *p = L->next;  // 跳過頭節點while (p != NULL) {printf("%d -> ", p->data);p = p->next;}printf("NULL\n");
}int main() {List L;Init(L);Insert(L, 1, 10);Insert(L, 2, 20);Insert(L, 3, 30);PrintList(L);return 0;
}
運行結果
10 -> 20 -> 30 -> NULL

4. 后插法實現前插法(交換數據法)

4.1 介紹

前插法 是指在 某個指定位置 i 之前 插入新節點:

原鏈表: A -> B -> C -> NULL
插入后: A -> X -> B -> C -> NULL (X 插入到 B 之前)

如果我們仍然使用后插法,可以通過 交換數據 來模擬前插效果:

  1. 找到 i 位置的節點 p
  2. 使用后插法p 后面 插入一個新節點 s
  3. 交換 psdata,這樣 p 的數據變成新插入的數據,而 s 變成原 p 的數據。

當然 這里也可以使用 直接插入法 不過 需要從頭 遍歷鏈表 至其前驅結點 ,這里沒有實現

4.2 代碼

bool Insert(List &L, int i, int value) {if (i < 1) return false;Node *p = L;int j = 0;// 找到第 i 個位置的節點 pwhile (p->next != NULL && j < i - 1) {  p = p->next;j++;}if (p == NULL) return false;// 使用后插法創建新節點 sNode *s = (Node *)malloc(sizeof(Node));s->data = value;s->next = p->next;p->next = s;// **交換數據**,實現前插效果int temp = p->data;p->data = s->data;s->data = temp;return true;
}

4.3 運行示例

int main() {List L;Init(L);Insert(L, 1, 10);Insert(L, 2, 20);Insert(L, 3, 30);Insert(L, 2, 15); // 插入 15 到第 2 個位置PrintList(L);return 0;
}
輸出
10 -> 15 -> 20 -> 30 -> NULL

15 被正確插入到了 20 之前,達到了前插的效果


5. 總結

后插法前插法(交換數據法)
插入方式i 個節點 之后插入i 個節點 之前插入
鏈表變化A -> B -> X -> CA -> X -> B -> C
i=1 時的情況頭結點不變,只插入到 L->next 之后頭結點改變,新節點變成 L
適用場景常用于 順序插入,如尾插法適用于 倒序插入,如頭插法
優點邏輯清晰,適用于大多數情況結構不變,適用于數據交換優化

兩種插入方式的使用場景不同,在 動態鏈表管理 中,后插法適合 正常數據流,前插法適合 逆序處理


6. 參考代碼完整示例

#include <stdio.h>
#include <stdlib.h>typedef struct Node {int data;struct Node* next;
} Node, *List;bool Init(List &L) {L = (Node *)malloc(sizeof(Node));L->next = NULL;return true;
}bool Insert(List &L, int i, int value) {if (i < 1) return false;Node *p = L;int j = 0;while (p->next != NULL && j < i - 1) {  p = p->next;j++;}if (p == NULL) return false;Node *s = (Node *)malloc(sizeof(Node));s->data = value;s->next = p->next;p->next = s;int temp = p->data;p->data = s->data;s->data = temp;return true;
}

希望本文能幫助新手更好地學習C++鏈表的學習!

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

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

相關文章

Prometheus的工作流程

Prometheus 是一個開源的監控和告警系統&#xff0c;專為監控分布式系統而設計。它的工作流程主要包括以下幾個關鍵步驟&#xff1a; 1. 數據采集 (Scraping) 目標發現 (Service Discovery)&#xff1a; Prometheus 自動或手動配置監控目標&#xff0c;通過 DNS、Kubernetes、…

軟件工程面試題(二十二)

1、常用的設計模式有哪些&#xff1f;并寫出一段程序代碼 Factory(工廠模式)&#xff0c;Adapter(適配器模式)&#xff0c;Singleton(單例模式)&#xff0c;State(狀態模式)&#xff0c;Observer(觀察者模式) 等。 單例模式 public class Singleton{ private static Singleton …

【Pandas】pandas DataFrame select_dtypes

Pandas2.2 DataFrame Attributes and underlying data 方法描述DataFrame.index用于獲取 DataFrame 的行索引DataFrame.columns用于獲取 DataFrame 的列標簽DataFrame.dtypes用于獲取 DataFrame 中每一列的數據類型DataFrame.info([verbose, buf, max_cols, …])用于提供 Dat…

如何利用ATECLOUD測試平臺的芯片測試解決方案實現4644芯片的測試?

作為多通道 DC-DC 電源管理芯片的代表產品&#xff0c;4644 憑借 95% 以上的轉換效率、1% 的輸出精度及多重保護機制&#xff0c;廣泛應用于航天航空&#xff08;衛星電源系統&#xff09;、醫療設備&#xff08;MRI 梯度功放&#xff09;、工業控制&#xff08;伺服驅動單元&a…

Python 編程實戰:打造高效便捷的目錄結構生成器

Python 編程實戰&#xff1a;打造高效便捷的目錄結構生成器 相關資源文件已經打包成EXE文件&#xff0c;可雙擊直接運行程序&#xff0c;且文章末尾已附上相關源碼&#xff0c;以供大家學習交流&#xff0c;博主主頁還有更多Python相關程序案例&#xff0c;秉著開源精神的想法&…

移動端六大語言速記:第6部分 - 錯誤處理與調試

移動端六大語言速記:第6部分 - 錯誤處理與調試 本文將對比Java、Kotlin、Flutter(Dart)、Python、ArkTS和Swift這六種移動端開發語言在錯誤處理與調試方面的特性,幫助開發者理解和掌握各語言的異常處理機制。 6. 錯誤處理與調試 6.1 異常處理 各語言異常處理的語法對比:…

PyTorch優化器

PyTorch 提供了多種優化算法用于神經網絡的參數優化。以下是對 PyTorch 中主要優化器的全面介紹&#xff0c;包括它們的原理、使用方法和適用場景。 一、基本優化器 1. SGD (隨機梯度下降) torch.optim.SGD(params, lr0.01, momentum0, dampening0, weight_decay0, nesterov…

C++的UDP連接解析域名地址錯誤

背景 使用c開發一個udp連接功能的腳本&#xff0c;可以接收發送數據&#xff0c;而且地址是經過內網穿透到外網的 經過 通常發送數據給目標地址&#xff0c;需要把目的地址結構化&#xff0c;要么使用inet_addr解析ip地址&#xff0c;要么使用inet_pton sockaddr_in target…

Spark,上傳文件

上傳文件 1.上傳 先使用命令打開HDFS的NameNode [roothadoop100 hadoop-3.1.3]$ sbin/start-dfs.sh [roothadoop100 hadoop-3.1.3]$ sbin/stop-dfs.sh 和YARN的Job [roothadoop101 hadoop-3.1.3]$ sbin/start-yarn.sh [roothadoop101 hadoop-3.1.3]$ sbin/stop-yarn.sh 在Nam…

如何為Linux/Android Kernel 5.4和5.15添加 fuse passthrough透傳功能 ?

背景 參考&#xff1a;Google文檔 FUSE 透傳 參考此文檔&#xff0c;目前kernel.org提供的fuse passthrough補丁在6.9版本之后&#xff0c;但想要在5.4和5.15版本內核做移植應該如何簡單點呢&#xff1f;文檔中提到 Android的內核為5.4 和 5.15版本內核做了fuse passthrough功…

Ubuntu 防火墻配置

Ubuntu 的防火墻配置可以參考文章&#xff1a;Firewall - Ubuntu Server documentation 22 端口 需要注意的是&#xff0c;在啟動防火墻之前&#xff0c;需要先開放 22 端口。 否則 SSH 將會拒絕你連接防火墻。 開放 22 端口的命令為&#xff1a;sudo ufw allow 22 添加端…

Jetson 設備卸載 OpenCV 4.5.4 并編譯安裝 OpenCV 4.2.0

?一、卸載 OpenCV 4.5.4? 清除已安裝的 OpenCV 庫? sudo apt-get purge libopencv* python3-opencv # 卸載所有APT安裝的OpenCV包?:ml-citation{ref"1,3" data"citationList"}sudo apt autoremove # 清理殘留依賴?:ml-citation{ref"1,4"…

《AI大模型應知應會100篇》第57篇:LlamaIndex使用指南:構建高效知識庫

第57篇&#xff1a;LlamaIndex使用指南&#xff1a;構建高效知識庫 摘要 在大語言模型&#xff08;LLM&#xff09;驅動的智能應用中&#xff0c;如何高效地管理和利用海量知識數據是開發者面臨的核心挑戰之一。LlamaIndex&#xff08;原 GPT Index&#xff09; 是一個專為構建…

Sentinel[超詳細講解]-4

&#x1f693; 主要講解流控模式的 三種方式中的兩種&#xff1a; 直接、鏈路&#x1f680; 1?? 直接模式 &#x1f68e; 直接模式&#xff1a;對資源本身進行限流&#xff0c;例如對某個接口進行限流&#xff0c;當該接口的訪問頻率超過設定的閾值時&#xff0c;直接拒絕新的…

工作記錄 2017-03-24

工作記錄 2017-03-24 序號 工作 相關人員 1 修改了郵件上的問題。 更新RD服務器。 郝 更新的問題 1、修改了New User時 init的保存。 2、文件的查詢加了ID。 3、加了 patient insurance secondary 4、修改了payment detail的處理。 識別引擎監控 Ps (iCDA LOG :剔除…

裴蜀定理:整數解的奧秘

裴蜀定理&#xff1a;整數解的奧秘 在數學的世界里&#xff0c;裴蜀定理&#xff08;Bzout’s Theorem&#xff09;是數論中一個非常重要的定理&#xff0c;它揭示了二次方程和整數解之間的關系。它不僅僅是純粹的理論知識&#xff0c;還在計算機科學、密碼學、算法優化等多個…

python之 “__init__.py” 文件

提示&#xff1a;python之 “init.py” 文件 文章目錄 前言一、Python 中 __init__.py 文件的理解1. What&#xff08;是什么&#xff09;2. Why&#xff08;為什么需要&#xff09;3. Where&#xff08;在哪里使用&#xff09;4. How&#xff08;如何使用&#xff09; 二、問題…

Gemini 2.5 Pro與Claude 3.7 Sonnet編程性能對比

AI領域的語言模型競賽日趨白熱化,尤其在編程輔助方面表現突出。 Gemini 2.5 Pro和Claude 3.7 Sonnet作為該領域的佼佼者,本文通過一系列編程測試與基準評估對兩者的編碼功能進行對比分析。 核心結論: ? Gemini 2.5 Pro在SWE Bench硬核編程測試中以63.8%的通過率略勝Clau…

On Superresolution Effects in Maximum Likelihood Adaptive Antenna Arrays論文閱讀

On Superresolution Effects in Maximum Likelihood Adaptive Antenna Arrays 1. 論文的研究目標與實際問題意義1.1 研究目標1.2 解決的實際問題1.3 實際意義2. 論文提出的新方法、模型與公式2.1 核心創新:標量化近似表達式關鍵推導步驟:公式優勢:2.2 與經典方法的對比傳統方…

GIT 撤銷上次推送

注意&#xff1a;在執行下述操作之前先備份現有工作進度&#xff0c;如果不慎未保存&#xff0c;在代碼編輯器中正在修改的文件下&#xff0c;使用CtrlZ 撤銷試試 撤銷推送的方法 情況 1&#xff1a;您剛剛推送到遠程倉庫 如果您的推送操作剛剛完成&#xff0c;并且沒有其他…