數據結構(單鏈表)

目錄

1.鏈表的概念及結構

2.單鏈表的應用

2.1 打印鏈表

2.2申請新節點

2.3插入(尾刪和頭刪)

2.4刪除(尾刪和頭刪)

2.5查找

2.6任意位置插入

2.7刪除指定位置的元素

2.8 銷毀鏈表

3.總結


1.鏈表的概念及結構

(1)概念:鏈表是?種物理存儲結構上?連續、?順序的存儲結構,數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的 。與順序表的區別在于鏈表的空間是要一個給一個,不在是內存空間溢出時將內存空間*2.

(2)結構:

struct SListNode
{int data; //節點數據struct SListNode* next; //指針變量?保存下?個節點的地址
};

鏈表是由節點組成的,節點包含節點數據和下一個節點的地址。按照順序打印結構如下。

2.單鏈表的應用

2.1 打印鏈表

通過while (pcur)來判斷是否到達鏈表結尾NULL,pcur = pcur->next將下一跳的地址賦值到pcur來達到循環。

void SLTPrint(SLTNode* phead)
{SLTNode* pcur = phead;while (pcur){printf("%d->", pcur->data);pcur = pcur->next;}printf("NULL\n");
}

2.2申請新節點

定義一個新的結構體指針來完成,用元素的擴容(插入)。

SLTNode* SLTBuyNode(SLTDataType x)
{SLTNode* node = (SLTNode*)malloc(sizeof(SLTNode));if (node == NULL){perror("malloc fail!");exit(1);}node->data = x;node->next = NULL;return node;
}

2.3插入(尾刪和頭刪)

為什么要用雙指針(SLTNode** pphead):
????????使用雙指針 SLTNode** pphead,通過 *pphead = newnode 可以直接修改調用者傳遞的頭指針地址,從而更新鏈表的頭節點。如果使用單指針,只能修改局部變量phead的值,無法修改鏈表的地址。

? ? ? ? 總結就是,pphead只是形參,要想通過修改形參來改變實參就必須傳實參的地址。

//尾插
void SLTPushBack(SLTNode** pphead, SLTDataType x)
{assert(pphead);SLTNode* newnode = SLTBuyNode(x);if (*pphead == NULL){*pphead = newnode;}else{SLTNode* pcur = *pphead;while (pcur->next){pcur = pcur->next;}pcur->next = newnode;}
}
//頭插
void SLTPushFront(SLTNode** pphead, SLTDataType x)
{assert(pphead);SLTNode* newnode = SLTBuyNode(x);if (*pphead == NULL){*pphead = newnode;}else{newnode->next = *pphead;}*pphead = newnode;
}

2.4刪除(尾刪和頭刪)

鏈表重新連接好后要釋放掉刪除部分的地址(free)

//尾刪
void SLTPopBack(SLTNode** pphead)
{assert(pphead && *pphead);if ((*pphead)->next == NULL){free(*pphead);*pphead = NULL;}else{SLTNode* ptail = *pphead;SLTNode* pcur = NULL;while (ptail->next){pcur = ptail;ptail = ptail->next;}pcur->next = NULL;free(ptail);ptail = NULL;}
}
//頭刪
void SLTPopFront(SLTNode** pphead)
{assert(pphead && *pphead);if ((*pphead)->next == NULL){free(*pphead);*pphead = NULL;}else{SLTNode* ptail = *pphead;SLTNode* pcur = ptail->next;free(ptail);ptail = NULL;*pphead = pcur;}
}

2.5查找

通過比對data來找到pos的地址。

這里我調試時出現返回的pos1地址傳到我新建立的結構體指針中,高位不一致,但低位一致,問題產生的主要原因是,頭文件中函數沒有定義,我給注釋掉了。

SLTNode* SLTFind(SLTNode* phead, SLTDataType x)
{assert(phead);SLTNode* pos1 = phead;while (pos1 != NULL){if (pos1->data == x){return pos1;}pos1 = pos1->next;}return NULL; // 未找到或鏈表為空時返回 NULL
}

2.6任意位置插入

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

2.7刪除指定位置的元素

//刪除pos結點
void SLTErase(SLTNode** pphead, SLTNode* pos)
{assert(pphead);assert(pos);SLTNode* pcur = *pphead;while (pcur->next != pos){pcur = pcur->next;}pcur->next = pos->next;
}
//刪除pos之后的結點
void SLTEraseAfter(SLTNode* pos)
{assert(pos);if (pos->next == NULL){printf("POS后沒有元素\n");return;}else{ SLTNode* pcur = pos->next;pos->next = pcur->next;free(pcur);                // 釋放被刪除節點的內存pcur = NULL;               // 防止懸空指針}}

2.8 銷毀鏈表

//銷毀鏈表
void SListDestroy(SLTNode** pphead)
{free(*pphead);*pphead = NULL;
}

3.總結

? ? ? ? 主要完成了單鏈表的插,刪,查等功能,編寫過程中掌握調試的基本方法。原代碼地址在我的gitee倉庫中,有需要可以下載查看。https://gitee.com/lisien123/c_learn/tree/master/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/25-8-31%E5%8D%95%E9%93%BE%E8%A1%A8

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

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

相關文章

電腦沒加域卻能獲取到IP地址

企業網絡管理的核心邏輯!電腦沒加域卻能獲取到IP地址,這完全是一種刻意為之的安全設計,而不是網絡故障。 簡單來說就是:“給你IP,但不給你權限。” 這背后是一套完整的 網絡準入控制(NAC) 策略。…

Go語言入門學習筆記

📚 前言 歡迎學習Go語言!這份教材假設您是編程零基礎,從最基本的概念開始講解。Go語言(也稱為Golang)由Google開發,簡單、高效、并發能力強,適合后端開發、系統編程和云計算。 學習建議&#xf…

gradle安裝、配置環境變量、配置阿里源及idea 中配置gradle

下載gradle https://services.gradle.org/distributions/ 配置系統環境變量 新增GRADLE_HOME D:\Information_Technology\App\gradle-8.14.3-bin\gradle-8.14.3 新增GRADLE_USER_HOME D:\Information_Technology\App\gradleHouse 設置 path,新增一行 %GRADLE_…

C# FlaUI win 自動化框架,介紹

一、簡潔介紹 FlaUI 是一套基于 .NET 的 Windows 桌面應用自動化測試庫,支持 Win32、WinForms、WPF、UWP 等多種類型的應用。它基于微軟原生 UI Automation 庫,提供了更現代、易用的 API,適合自動化測試工程師和開發者實現高效、可維護的 UI …

命名空間級別應用 Pod 安全標準

🎯 命名空間級別應用 Pod 安全標準 一、創建 Kubernetes 集群(使用 kind) 使用 kind (Kubernetes IN Docker)快速創建一個本地集群: kind create cluster --name my-cluster驗證集群是否運行正常&#xff1…

Ubuntu 25.10 Snapshot4 發布。

Ubuntu 25.10 的第四個快照(Snapshot 4)已于 2025 年 8 月 28 日發布,供開發者和測試人員進行驗證。這是 Ubuntu 25.10 正式發布前的最后一個月度快照,標志著該版本已進入功能凍結階段,預計將在 10 月發布正式版。 Ca…

STM32F2/F4系列單片機解密和芯片應用介紹

STM32F2/F4系列單片機解密和芯片應用介紹STM32F2和STM32F4系列微控制器憑借其出色的性能、豐富的外設接口和強大的連接能力,在很多對計算能力和實時性有要求的領域都有應用。同時,芯片解密的價格因其型號、加密技術等因素差異較大。🧭 重要提…

250901-BookStack跨服務器從Rootless-Docker到Rootful-Docker的備份遷移及服務啟動

下面給你一套「可離線、最小停機」的遷移步驟,從 A(rootless)搬到 B(rootful)。思路是:停 A → 打包數據卷 → 傳到 B → 還原 → 用同版本鏡像啟動 → 驗證。整套操作不依賴公網,只用你已有的離…

(Redis)Redis 分布式鎖及改進策略詳解

一、為什么需要分布式鎖在單機應用中,synchronized 或 ReentrantLock 足以解決并發問題。但在 分布式系統 中,多臺服務器之間共享同一個資源時,如果沒有鎖,很可能出現 超賣、重復扣減、數據不一致 等問題。 因此,分布式…

Linux應用開發-windows,linux環境下相關工具

VS Code Remote - SSH 虛擬機部分的操作 sudo systemctl status sshsudo apt update sudo apt install openssh-server sudo systemctl start ssh sudo systemctl enable ssh # 設置開機自啟hostname -IVS Code部分的操作 安裝 Remote - SSH 插件 vscode右下角出現&#xff…

Java泛型通配符詳解:搞懂?/extends/super用法,避開集合操作踩坑點

上次跟你們聊了泛型的基礎用法,今天接著往下說 —— 泛型里還有個挺重要的概念叫 “通配符”,就是那個問號 “?”,很多人第一次見都懵:這玩意兒跟普通泛型有啥區別?為啥有時候非得用它不可?小索奇當初也卡…

EXCEL開發之路(二)跨表交互模擬—仙盟創夢IDE

在車輛租賃行業,數據的高效管理與分析對于企業的運營決策、資源調配及客戶服務優化至關重要。自建 Excel 實現多表統計交互,如同為行業裝上了效能驅動引擎,助力企業在復雜多變的市場環境中穩健前行。一、精準資源管理,優化車輛調配…

醫療AI時代的生物醫學Go編程:高性能計算與精準醫療的案例分析(八)

5.4 性能測試與結果分析 為了評估GoEHRStream的性能,我們設計測試模擬真實的醫院數據流場景,并測量關鍵指標。 5.4.1 實驗環境 硬件: CPU: Intel Xeon E-2288G (8 cores, 16 threads) RAM: 32 GB DDR4 Storage: 512 GB NVMe SSD (用于GoEHRStream和BadgerDB) Network: 1 G…

開關電源設計“反饋回路”部分器件分析

目錄 主要分析問題如下: 一、問題1 二、問題二 分析電路如下: 主要分析問題如下: 1、分析TL431芯片1、2兩引腳間并聯電阻和電容(RC電路)的作用? 2、PC817A光耦輸入兩個引腳間并聯電阻的作用?…

AI 編程新玩法:用 yunqi-saas-kit 框架制作小游戲,看廣告變現輕松賺錢?

AI 編程新玩法:用 yunqi-saas-kit 框架制作小游戲,看廣告變現輕松賺錢 在數字經濟快速發展的當下,AI 技術正不斷滲透到各個領域,其中 **#AI 編程憑借高效、便捷的優勢,成為不少開發者和創業者的新選擇。尤其是在小游戲…

Kafka 架構原理

一個kafka集群中包含一個或多個Producer、一個或多個broker、一個或多個ConsumerGrop以及一個Zookeeper集群。kafka通過Zookeeper管理kafka集群配置、leader副本的選舉、生產者的負載均衡等。Producer使用push模式將消息發布到broker,Consumer使用pull模式從broker訂閱并消費消…

用 PyTorch 搭建 CNN 實現 MNIST 手寫數字識別

在圖像識別領域,卷積神經網絡(CNN) 憑借其對空間特征的高效提取能力,成為手寫數字識別、人臉識別等任務的首選模型。而 MNIST(手寫數字數據集)作為入門級數據集,幾乎是每個深度學習學習者的 “第…

CTFshow系列——命令執行web61-68

本篇文章介紹了不同了方法進行題目的解析以及原因講解。 文章目錄Web61嘗試了一下,被過濾的payload如下:所以,根據上述思路,這里嘗試過的payload為:Web62(同Web61)Web63(同Web62&…

.Net程序員就業現狀以及學習路線圖(二)

一、.NET程序員就業現狀分析 1. 市場需求與崗位分布 2025年.NET開發崗位全國招聘職位約1676個,占全國技術崗位的0.009%,主要集中在一線城市如深圳、上海等地。就業單位類型分布為:軟件公司占43.3%,研發機構占33.1%,物聯…

MTK Linux DRM分析(二十二)- MTK mtk_drm_crtc.c(Part1)

一、代碼分析 mtk_drm_crtc.c以mtk_crtc_comp_is_busy函數為界限進行拆分分析 static const struct drm_crtc_funcs mtk_crtc_funcs = {.set_config = drm_atomic_helper_set_config,.page_flip = drm_atomic_helper_page_flip,.destroy = mtk_drm_crtc_destroy,.reset = mtk…