C語言單鏈表的增刪改補

目錄

(一)單鏈表的結構定義及初始化

(二)單鏈表的尾插,頭插

?

(三)單鏈表的尾刪,頭刪

(四)單鏈表的查找,刪除,銷毀


單鏈表是數據結構課程里的第二個數據結構。單鏈表在邏輯結構是連續的,在物理結構不一定連續。因為在單鏈表的每一個結點的內存是在堆區動態開辟的,由操作系統來決定是否連續開辟在相同的區域。


(一)單鏈表的結構定義及初始化

#define SLDataType int//單鏈表的結構定義
typedef struct SingleList
{SLDataType val;struct SingleList* next;
}SL;

單鏈表的每一個節點都有其數值域和指針域。數值域是當前結點所存儲的數值,指針域是存儲指向下一個結點的指針。這里我們定義一個宏,把SLDataType 替換成int,以后想換存儲的數據類型就方便多了。我們再把單鏈表的數據類型struct SingleList重命名為SL。

//單鏈表的初始化
void InitSingleList(SL* phead)
{assert(phead);phead->val = 0;phead->next = NULL;
}

(二)單鏈表的尾插,頭插

單鏈表的尾插是指在單鏈表的結尾插進去一個新結點。我們可以創建一個函數專門封裝創建一個新結點的過程

//創建一個新結點
SL* BuyNewNode(SLDataType x)
{SL* NewNode = (SL*)malloc(sizeof(SL));if (NewNode == NULL){perror("malloc fail!\n");eixt(1);    }//走到這說明新結點的內存創建成功NewNode->val = x;NewNode->next = NULL;return NewNode;
}

每次創建結點的時候必須要檢查結點是否創建失敗,而且要記得要釋放空間。我們這里通過malloc申請了一片SL大小的空間。并將申請的空間解釋為SL*類型,把SL里面的值賦值為x,下一個結點指向為NULL指針。

//單鏈表的尾插
void SingleListPushBack(SL** pphead, SLDataType x)
{//這里需要用二級指針,因為可能傳進來的指針沒有結點,尾插變成頭插,需要對頭結點的地址進行賦值。assert(pphead);SL* phead = *pphead;if (phead == NULL){//說明單鏈表沒有一個結點,需要修改頭結點的地址phead = BuyNewNode(x);}else{//需要遍歷鏈表找到尾結點SL* pcur = phead;while (pcur){pcur = pcur->next;}//我們要讓鏈表后面的順序為   pcur  ->  NewNodepcur->next = BuyNewNode(x);}
}
//單鏈表的頭插
void SingleListPushFront(SL** pphead, SLDataType x)
{   assert(pphead);//同樣的頭插就更需要傳二級指針了SL* phead = *pphead;//NewNode  -> phead;SL* NewNode = BuyNewNode(x);NewNode->next = phead;phead = NewNode;
}

(三)單鏈表的尾刪,頭刪

同樣的操作

//單鏈表的尾刪
void SingleListPopBack(SL** pphead)
{assert(pphead && *phead);SL* phead = *pphead;//如果單鏈表只有一個結點if (phead-> next == NULL){free(phead);phead = NULL;}else{//需要遍歷查找鏈表尾部SL* pcur = phead;SL* prev = NULL;while (pcur->next){prev = pcur;pcur = pcur->next;}//  pcur  pcur->nextprev->next = NULL;free(pcur->next);pcur->next = NULL;}
}
//單鏈表的頭刪
void SingleListPopFront(SL** pphead)
{   assert(pphead && *pphead);SL* phead = *pphead;// phead phead->next;SL* next = phead->next;free(phead);phead = next;
}

(四)單鏈表的查找,刪除,銷毀
//單鏈表的查找
SL* FindSingleList(SL* phead, SLDataType x)
{assert(phead);SL* pcur = phead;while (pcur){    if (pcur->val == x)return pcur;pcur = pcur->next;}return NULL;
}
//刪除pos結點
void SLTErase(SLTNode** pphead, SLTNode* pos)
{assert(pphead && pos);//pos就是頭結點if (pos == *pphead){SLTPopFront(pphead);}else {SLTNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}//prev pos pos->nextprev->next = pos->next;free(pos);pos = NULL;}
}
//單鏈表的銷毀
void SListDestroy(SLTNode** pphead)
{SLTNode* pcur = *pphead;while (pcur){SLTNode* next = pcur->next;free(pcur);pcur = next;}*pphead = NULL;
}

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

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

相關文章

Android10.0 framework第三方無源碼APP讀寫斷電后數據丟失問題解決

1.前言 在10.0中rom定制化開發中,在某些產品開發中,在某些情況下在App用FileOutputStream讀寫完畢后,突然斷電 會出現寫完的數據丟失的問題,接下來就需要分析下關于使用FileOutputStream讀寫數據的相關流程,來實現相關 功能 2.framework第三方無源碼APP讀寫斷電后數據丟…

殺戮尖塔(Slay The Spire) 的全新角色模組 - 女巫

女巫(The Witch) 殺戮尖塔(Slay The Spire) 的全新角色模組 女巫模組為游戲增添了超過 75 張新卡牌和 4 個全新遺物,圍繞 詛咒(Curses) 展開獨特的玩法體驗。她的起始遺物 黑貓(Bl…

AI開發學習路線(闖關升級版)

以下是一份輕松版AI開發學習路線,用「闖關升級」的方式幫你從零開始變身AI開發者,每個階段都配有有趣的任務和實用資源,保證不枯燥、可落地!👇 目錄 🔰 新手村:打基礎(1-2個月&…

迭代器模式深度解析與實戰案例

一、模式定義 迭代器模式(Iterator Pattern) 是一種行為設計模式,提供一種方法順序訪問聚合對象的元素,無需暴露其底層表示。核心思想是將遍歷邏輯從聚合對象中分離,實現 遍歷與存儲的解耦。 二、核心組件 組件作用…

SSH遠程工具

一、常見SSH遠程工具 工具開源跨平臺多標簽文件傳輸高級功能價格Xshell?Win????腳本、會話管理免費/商業版Tabby??全平臺????插件擴展免費MobaXterm?Win????集成工具集免費/付費SecureCRT?Win/macOS/Linux????企業級加密$129+PuTTY??全平臺??基礎連接…

VUE中的路由處理

1.引入,預處理main.ts import {} from vue-router import { createRouter, createWebHistory } from vue-router import HomePages from @/pages/HomePages.vue import AboutPage from @/pages/AboutPage.vue import NewsPage from @/pages/NewsPage.vue //1. 配置路由規…

編程助手fitten code使用說明(超詳細)(vscode)

這兩年 AI 發展迅猛,作為開發人員,我們總是追求更快、更高效的工作方式,AI 的出現可以說改變了很多人的編程方式。 AI 對我們來說就是一個可靠的編程助手,給我們提供了實時的建議和解決方,無論是快速修復錯誤、提升代…

Opencv計算機視覺編程攻略-第九節 描述和匹配興趣點

一般而言,如果一個物體在一幅圖像中被檢測到關鍵點,那么同一個物體在其他圖像中也會檢測到同一個關鍵點。圖像匹配是關鍵點的常用功能之一,它的作用包括關聯同一場景的兩幅圖像、檢測圖像中事物的發生地點等等。 1.局部模板匹配 憑單個像素就…

C++內存管理優化實戰:提升應用性能與效率

🧑 博主簡介:CSDN博客專家、CSDN平臺優質創作者,高級開發工程師,數學專業,擁有高級工程師證書;擅長C/C、C#等開發語言,熟悉Java常用開發技術,能熟練應用常用數據庫SQL server,Oracle…

17-產品經理-創建發布

點擊“發布”-“創建發布”。 填寫發布名稱,選擇測試的版本。還可以設置此次發布是否為“里程碑”。 點擊“保存”后,進入該發布詳情頁面。需要為此次發布關聯需求、已解決BUG、以及遺留BUG。可以通過設置條件,進行“搜索”,然后批…

Axure RP9.0教程 | 內聯框架 對應html 元素中的iframe標簽 (打開內部頁面和外部網址)

文章目錄 引言I 打開內部頁面II 打開外部網址操作效果引言 應用場景: 選擇右側不同欄目,左側內容發生變化 I 打開內部頁面 在公用元件庫中找到內聯框架圖標,將其拖到畫布中,設置其寬、高;在右側添加三個按鈕,分別用來跳轉三個不同的頁面;在內部框架中,添加三個子頁面,…

在1panel中安裝WebUI

如果需要建站,那得選安裝Openresty。點擊應用商店,安裝 Openresty 接下來安裝Ollama,可以部署本地模型提供給WebUi平臺使用 最后是安裝 WebUi,安裝時需要填寫Ollama的地址: 容器地址:30000 這些安裝都很方便&#xf…

項目難點亮點

Vue項目 RBAC設計 用戶權限設置 WebSocket 消息處理 BPMN擴展 跨語言模型的調用 大片文件(影像,模型等,數據-模型集成) 組件&指令封裝 低代碼表單構建、BPMN編輯器集成與實現 通用參考點 若依(RuoYi)是一個基于 Vue.js 和 Spring Boot 的前后端分離權限管理系…

JVM生產環境調優實戰

案例三:JVM頻繁Full GC優化 1. 項目背景(Situation) 在云中萬維跨境支付的反洗錢系統中,我們負責對海量交易數據進行實時規則校驗,以確保符合監管要求。系統日均處理交易量超過500萬筆,峰值QPS達到3000&a…

ASP.NET Web 中進行 GET/POST 提交并接收返回數據的幾種方案

在 ASP.NET Web 應用程序中進行 GET 請求并接收返回數據可以通過多種方式實現,以下是幾種常見的方法: 1. 使用 WebClient 類(簡單方式) using System.Net; using System.IO;public string GetDataFromUrl(string url) {using (W…

Springboot--Kafka客戶端參數關鍵參數的調整方法

調整 Kafka 客戶端參數需結合生產者、消費者和 Broker 的配置,以實現性能優化、可靠性保障或資源限制。以下是關鍵參數的調整方法和注意事項: 一、生產者參數調整 ?max.request.size? ?作用?:限制單個請求的最大字節數(包括消…

Android學習總結之service篇

引言 在 Android 開發里,Service 與 IntentService 是非常關鍵的組件,它們能夠讓應用在后臺開展長時間運行的操作。不過,很多開發者僅僅停留在使用這兩個組件的層面,對其內部的源碼實現了解甚少。本文將深入剖析 Service 和 Inte…

ExternalProject_Add 使用手冊與文檔詳解

一、基本概念與語法 ExternalProject_Add 是 CMake 的一個核心命令,用于在構建過程中集成和管理外部項目(如第三方庫)。它支持完整的生命周期管理,包括下載、配置、構建、安裝和測試。 語法: ExternalProject_Add(&l…

低延遲云網絡的核心技術

低延遲云網絡通過架構優化、協議創新、硬件加速等多維度技術手段,將數據傳輸延遲降低至毫秒級甚至微秒級。 1. 網絡架構優化 1.1 扁平化網絡Leaf-Spine 架構 減少網絡層級,縮短數據轉發路徑(如數據中心內部一跳可達)。 扁平化網絡Leaf-Spine(葉子-脊椎)架構是一種現代…

網絡安全法規與入門指南

在當今數字化時代,網絡安全已成為保障個人隱私、企業利益和國家安全的關鍵領域。隨著網絡攻擊的日益復雜和頻繁,了解和遵守網絡安全法規變得尤為重要。本文將深入探討網絡安全相關法規,并為想要進入這一領域的讀者提供實用的入門指南。 一、…