C語言<數據結構-單鏈表>(收尾)

? ? ? ?上篇博客我將基礎的尾插、尾刪、頭插、頭刪逐一講解了,這篇博客將對上篇博客進行收尾,講一下指定位置操作增刪以及查找這幾個函數,其實大同小異:

一.查找函數:

查找函數其實就是一個簡單的循環遍歷,所以不加以過多贅述:

SLTNode* SLTFind(SLTNode* phead, SLTDataType x)
{SLTNode* cur = phead;while (cur){if (cur->data == x){return cur;}cur = cur->next;}return NULL;
}

二.指定位置前插入函數:

void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{assert(pos);assert(pphead);if (pos == *pphead){SLTPushFront(pphead, x);}else{//找到pos前一個位置:SLTNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}SLTNode* newnode = BuySLTNode(x);prev->next = newnode;newnode->next = pos;}
}

代碼解釋:

  1. 頭插特殊處理

    if (pos == *pphead)
    {SLTPushFront(pphead, x);
    }
    
    • 若在頭節點前插入,調用專門的頭插函數
    • 確保頭指針正確更新
  2. 查找前驅節點

    SLTNode* prev = *pphead;
    while (prev->next != pos)
    {prev = prev->next;
    }
    
    • 從頭節點開始遍歷,尋找pos的前驅節點
    • pos是頭節點,此循環不會執行
  3. 插入新節點

    SLTNode* newnode = BuySLTNode(x);
    prev->next = newnode;
    newnode->next = pos;
    

    • 創建新節點并連接到鏈表中
    • 指針操作順序正確,不會破壞鏈表結構

三.在指定位置刪除函數:

void SLTErase(SLTNode** pphead, SLTNode* pos)
{assert(pphead);assert(pos);if (*pphead == pos){SLTPopFront(pphead);}else{//找到pos前一個位置;SLTNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}prev->next = pos->next;free(pos);}
}

代碼解釋:

  1. 頭刪特殊處理

    if (*pphead == pos)
    {SLTPopFront(pphead);
    }
    

    • 若刪除頭節點,調用專門的頭刪函數
    • 確保頭指針正確更新
  2. 查找前驅節點

    SLTNode* prev = *pphead;
    while (prev->next != pos)
    {prev = prev->next;
    }
    

    • 從頭節點開始遍歷,尋找pos的前驅節點
    • pos是頭節點,此循環不會執行
  3. 刪除節點

    prev->next = pos->next;
    free(pos);
    
    • 調整前驅節點指針跳過pos
    • 釋放pos節點的內存

四.指定位置之后插入函數:

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

較為簡單,不加以贅述;

五.指定位置之后刪除函數:

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

較為簡單,不加以贅述;

六.函數復用:

當寫出指定位置操作的幾個函數以后,之前的那幾個操作函數就可以直接套用指定位置的函數;

具體位置怎么設定留給你們自己思考一下,函數的復用我會在下一篇雙向鏈表花一定的篇幅。

其實,要想快速的寫出鏈表,都是先寫指定位置函數,然后再去復用實現頭尾的操作。

? ? ? 單鏈表一開始理解確實是有點困難的,但是一旦理解了以后,后續的雙向鏈表之類的就變得簡單了。雖然鏈表有很多種類,但是只要理解了單鏈表以后,其他的除了結構比單鏈表復雜以外難度遠不及單鏈表!!!

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

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

相關文章

十年架構心路:從單機到云原生的分布式系統演進史

十年架構心路:從單機到云原生的分布式系統演進史 這里寫目錄標題十年架構心路:從單機到云原生的分布式系統演進史一、技術生涯的起點:單體架構的黃金時代1.1 典型技術棧1.2 記憶深刻的故障二、分布式架構轉型期2.1 服務化拆分實踐2.2 分布式事…

使用docker搭建nginx

安裝docker 和 docker compose驗證docker版本配置docker目錄配置代理,使docker能訪問外網能否ping通最后直接拉入鏡像即可docker pull nginx

Intel新CPU助攻:微軟Copilot+將登陸臺式電腦

微軟的Copilot PC計劃已經推出一年多,但目前僅支持平板電腦和筆記本電腦,以及少數迷你電腦。 隨著Intel下一代桌面處理器——代號為“Arrow Lake Refresh”的推出,Copilot PC功能有望擴展到桌面計算機。 要支持Copilot PC的所有功能&#xff…

【Kubernetes】跨節點 Pod 網絡不通排查案例

最近在部署一個集群環境的時候,發現集群中一個子節點與其他子節點不通,而 master 節點可與任何子節點互通,通過抓包排查后,發現是 Linux 路由決策導致的。因此,在此記錄下來,希望對大家有所幫助。1、環境及…

【算法訓練營Day11】二叉樹part1

文章目錄理論基礎二叉樹的遞歸遍歷前序遍歷中序遍歷后序遍歷總結二叉樹的層序遍歷基礎層序遍歷二叉樹的右視圖理論基礎 二叉樹在結構上的兩個常用類型: 滿二叉樹完全二叉樹 在功能應用上的比較常用的有: 二叉搜索樹: 節點有權值、遵循”左…

Flutter 之 table_calendar 控件

1.庫導入在pubspec.yaml文件中dev_dependencies:table_calendar: ^3.2.02. 代碼編寫TableCalendar(daysOfWeekHeight: 20,availableGestures: AvailableGestures.horizontalSwipe,firstDay: DateTime.now().subtract(const Duration(days: 365)),lastDay: DateTime.now(),cal…

【leetcode】1486. 數組異或操作

數組異或操作題目題解題目 1486. 數組異或操作 給你兩個整數,n 和 start 。 數組 nums 定義為:nums[i] start 2*i(下標從 0 開始)且 n nums.length 。 請返回 nums 中所有元素按位異或(XOR)后得到的…

php7.4使用 new DateTime;報錯 Class DateTime not found

php7.4使用 new DateTime;報錯Uncaught Error: Class ‘app\home\c\DateTime’ not found 查了半天資料,最后找到了解決辦法 DateTime 是 php 內置的類,不隸屬于任何命名空間,如果你需要在命名空間中使用須有 \ 聲明,解決辦法就是…

Gartner《構建可擴展數據產品建設框架》心得

一、背景與價值 1.1 “數據產品”為什么忽然重要? 傳統模式:業務提出需求 → IT 建數據集 → ETL 管道爆炸 → 維護成本指數級上升。 新范式:把“數據”包裝成“產品”,以產品思維迭代演進,強調復用、自助、可擴展。 Gartner 觀察到:大量組織把“報表”或“數據倉庫”重…

CentOS/RHEL LVM 磁盤擴展完整教程

CentOS/RHEL LVM 磁盤擴展完整教程📝 前言 在Linux系統管理中,磁盤空間不足是經常遇到的問題。特別是在生產環境中,當根分區空間告急時,我們需要通過添加新磁盤來擴展存儲空間。本教程將詳細介紹如何在CentOS/RHEL系統中使用LVM&a…

LVGL應用和部署(用lua做測試)

【 聲明:版權所有,歡迎轉載,請勿用于商業用途。 聯系信箱:feixiaoxing 163.com】嵌入式產品做好了,下面就是測試和量產了。以按鍵屏幕的開發模式為例,如果僅僅是簡單的功能測試,那還比較好解決&…

phpstudy搭建pikachu

一.啟動mysql和nginx服務二.修改靶場文件參數點擊管理打開根目錄,將下載好的靶場源文件解壓到www目錄下三.找到此文件用記事本打開四.修改配置文件五.打開瀏覽器,輸入127.0.0.1/pikachu六.按照步驟初始化心得體會:如果mysql啟動又立刻停止,大…

【Linux】GDB/CGDB 調試器學習筆記

GDB/CGDB 調試器學習筆記🚀 前言 GDB 是 GNU 項目下功能強大的命令行調試器,適用于 C/C 等多種語言。CGDB 則是在 GDB 之上構建的輕量級 curses 界面,適合喜歡終端操作且習慣 vi 風格的人。一、GDB 入門篇 1. 編譯時帶調試信息 gcc -g -O0 -W…

鏈接代理后無法訪問網絡

路由方向的問題 cmd 輸入 route print 查看路由多了一個不是你網絡的路由 我的嘎嘎好用直接那都通 route add -p 0.0.0.0 mask 0.0.0.0 0.0.0.0 參考這個 固定ip if是代理鏈路的 鏈路口又敏感詞這個文章不合規兩次評論區問我

day37 早停策略和模型權重的保存

DAY 37 我今天的筆記是用cpu訓練的,請自行修改為gpu訓練 仍然是循序漸進,先復習之前的代碼 import torch import torch.nn as nn import torch.optim as optim from sklearn.datasets import load_iris from sklearn.model_selection import train_test_…

網絡爬蟲分類全解析

網絡爬蟲作為數據獲取的重要工具,其分類方式多樣,不同類型的爬蟲在技術實現、應用場景和功能特性上存在顯著差異。深入理解這些分類,有助于開發者根據實際需求選擇合適的爬蟲方案。本文將從技術特性、應用場景和架構設計三個維度,系統介紹網絡爬蟲的主要分類。 一、按技術…

ECR倉庫CloudFormation模板完整指南

概述 本文檔詳細介紹了一個通用的Amazon ECR(Elastic Container Registry)倉庫CloudFormation模板,該模板支持多業務組、參數化配置,并包含完整的安全策略、生命周期管理和監控功能。 模板特性 核心功能 ? 支持4個業務組:app、ai、mall、frontend? 靈活的服務名手動輸…

C++(STL源碼刨析/List)

一 List 核心字段和接口1. 節點字段template<class T> struct __list_node {typedef void* void_pointer;void_pointer prev;void_pointer next;T data; }由于 鏈表 不是連續的內存塊&#xff0c;所以對每一個申請到的內存塊要進行統一組織&#xff0c;也就是封裝成一個類…

蘋果App上架流程:不用Mac也可以上架的方法

iOS App 的上架流程一直被認為是門檻最高、流程最繁瑣的移動端工作之一。對很多使用 Windows 或 Linux 進行開發的跨平臺團隊來說&#xff0c;Mac 的缺位更放大了每一步的難度。 在我們近期為一款本地生活類 App 進行 iOS 上架時&#xff0c;團隊成員幾乎沒有配備本地 Mac&…

【爬蟲】- 爬蟲原理及其入門

爬蟲01 - 爬蟲原理及其入門 文章目錄爬蟲01 - 爬蟲原理及其入門一&#xff1a;爬蟲原理1&#xff1a;爬蟲的優勢?2&#xff1a;爬蟲的核心庫3&#xff1a;經典舉例4&#xff1a;合規問題一&#xff1a;爬蟲原理 學習爬蟲之前前置知識需要了解這些&#xff1a; 我的HTTP介紹, 了…