數據結構——單鏈表1

1. 單鏈表

1.1 概念與結構

概念:鏈表是一種物理存儲結構上非連續、非順序的存儲結構,數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的。

1.1.1 結點

  • 與順序表不同的是,鏈表里的每節都是獨立申請下來的空間,我們稱之為“節點/結點”
  • 節點的組成部分主要有兩個部分組成:當前節點要保存的數據(數據域)和保存下一個節點的地址(指針域)
  • 鏈表中每個節點都是獨立申請的,(需要插入數據時才去申請一塊節點的空間),需要指針變量來保存下一個節點的位置才可以從當前的節點找到下一個節點。

1.1.2 鏈表的性質

  • 鏈表結構在邏輯上時連續的,在物理結構上不一定是連續的
  • 節點一般是從堆上申請的
  • 從堆上申請來的空間,是按照一定的策略來分配的,每次申請的空間可能是連續的,也可能是不連續的

每個節點對應的結構體代碼:

typedef int SLTDataType;
//定義鏈表節點的結構
typedef struct SListNode
{SLTDataType  data;       //節點數據struct SListNode* next;  //下一個節點的地址
}SLTNode;

1.1.3 鏈表的打印

//單鏈表的打印
void SLTPrint(SLTNode* phead) {SLTNode* pcur = phead;while (pcur){printf("%d -> ",pcur->data);pcur = pcur->next;}printf("NULL\n");
}

1.2 實現單鏈表

SList.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>//定義單鏈表就是定義節點,因為單鏈表是由節點組成的,所以定義單鏈表就是定義節點
typedef int SLTDataType;
//定義鏈表節點的結構
typedef struct SListNode
{SLTDataType  data;struct SListNode* next;
}SLTNode;//單鏈表的打印
void SLTPrint(SLTNode* phead);//單鏈表的尾插
void SLTPushBack(SLTNode** pphead, SLTDataType x);//單鏈表的頭插
void SLTPushFront(SLTNode** pphead, SLTDataType x);//單鏈表的尾刪
void SLTPopBack(SLTNode** pphead);
SList.c
#include"SList.h"//單鏈表的打印
void SLTPrint(SLTNode* phead) {SLTNode* pcur = phead;while (pcur != NULL){printf("%d -> ",pcur->data);pcur = pcur->next;}printf("NULL\n");
}//新節點的申請
SLTNode* SLTBuyNode(SLTDataType x)
{SLTNode* node = (SLTNode*)malloc(sizeof(SLTNode));//申請新節點這里傳的應該是節點類型而不是數據類型//單鏈表:每次插入一個節點時,需要分配一個節點(結構體)的內存,因此使用 `sizeof(節點類型)`。//順序表:在擴容時,需要為多個數據元素分配一塊連續的內存(即數組),因此使用 `元素個數 * sizeof(數據類型)`。if (node == NULL){perror("malloc fail!\n");exit(1);}node->data= x;node->next = NULL;return node;
}//單鏈表的尾插
void SLTPushBack(SLTNode** pphead, SLTDataType x) {//單鏈表為空assert(pphead);//SLTNode* Tail = *pphead; 不能在這里定義Tail 因為這里的Tail為空,后面循環中的Tail->next 就會報錯,不會進入循環當中SLTNode* newnode = SLTBuyNode(x);if (*pphead == NULL){*pphead = newnode;}else {//單鏈表不為空,找尾節點,插入新節點SLTNode* Tail = *pphead;while (Tail->next != NULL){Tail = Tail->next;}//跳出循環,插入新節點Tail->next = newnode;//newnode->next = NULL; 不需要寫是因為,newnode在初始化的時候就已經置為NULL了}
}//單鏈表的頭插
void SLTPushFront(SLTNode** pphead, SLTDataType x) 
{assert(pphead);SLTNode* newnode = SLTBuyNode(x);newnode->next = *pphead;*pphead = newnode;
}//單鏈表尾刪
void SLTPopBack(SLTNode** pphead)
{assert(pphead);//只有一個節點的情況if ((*pphead)->next == NULL){free(*pphead);*pphead = NULL;}SLTNode* Tail = *pphead;SLTNode* prev = NULL;while (Tail->next){prev = Tail;Tail = Tail->next;}//跳出循環prev->next = NULL;free(Tail);Tail = NULL;
}

后續還有其它的單鏈表的實現哦~~~

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

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

相關文章

STM32CubeMX + HAL庫:基于DHT11溫濕度監測實現

1. 概述1.1 實驗目的本實驗旨在利用 DHT11 溫濕度傳感器&#xff0c;每隔 5 秒采集一次環境的溫度與濕度數據&#xff0c;并通過串口將數據循環打印輸出。所使用的 DHT11 模塊硬件結構簡單&#xff0c;包含三個接口引腳&#xff1a;電源正極&#xff08;VCC&#xff09;、電源負…

常見排序的特性總結

目錄 1.排序的穩定性 2.直接插入排序的特性總結 3.希爾排序的特性總結 4.直接選擇排序的特性總結 5.堆排序的特性總結 6.冒泡排序的特性總結 7.快速排序的特性總結 8.歸并排序的特性總結 9.計數排序的特性總結 10.總結 1.排序的穩定性 排序的穩定性是說 相同大小的元…

【硬件-筆試面試題】硬件/電子工程師,筆試面試題-49,(知識點:OSI模型,物理層、數據鏈路層、網絡層)

目錄 1、題目 2、解答 OSI 七層模型的分層及功能&#xff08;從下到上&#xff09; 1. 物理層&#xff08;Physical Layer&#xff09; &#xff1a;網卡的物理接口、網線、光纖、集線器 2. 數據鏈路層&#xff08;Data Link Layer&#xff09;&#xff1a;交換機&#xf…

R 環境安裝指南

R 環境安裝指南 引言 R 是一種針對統計計算和圖形表示的編程語言和軟件環境。它廣泛應用于數據分析和統計建模領域。本指南旨在為用戶提供一個清晰、詳細的 R 環境安裝步驟,確保用戶能夠順利地開始使用 R 進行數據分析。 安裝前的準備 在開始安裝 R 之前,請確保您的計算機…

Cesium entity跟隨第一人稱視角

1.跟隨視角let firstView:any; const firstPerspective (entity: any) > {firstView () > {let curTime window.viewer.clock.currentTime;const pos entity.position.getValue(curTime);const orientation entity.orientation.getValue(curTime);if (pos &&…

傳輸層協議UDP與TCP

目錄 一. UDP 1.1 UDP協議段格式 1.2 UDP傳輸的特點 1.3 面向數據報 1.4 UDP緩沖區 1.5 報文的理解 二. TCP 2.1 TCP協議段格式 2.2 確認應答機制&#xff08;ACK&#xff09; 2.3 超時重傳機制 2.4 連接管理機制 為什么要三次握手&#xff1f; 三次&#xff1f;四…

SringBoot入門

文章目錄SpringBoot入門一、關于&#xff1a;約定大于配置二、創建SpringBoot項目---起步案例創建SpringBoot項目案例創建項目方式2&#xff1a;通過aliyun網站創建創建項目方式3---基于官方地址創建三、配置項目項目結構自定義配置四、SpringBoot原理&#xff08;重點&#xf…

ansible 版本升級

1. 服務器上查看對應ansible 可安裝的版本 yum info ansible 對比官網,服務器對應ansible 版本比較地址,不利于了解新版本的屬性。 2. 升級比較新的ansible 版本,安裝epel-release wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm rpm -iv…

企業微信API接口發消息實戰:從0到1的技術突破之旅

摘要&#xff1a;本文詳細介紹了通過企業微信官方API接口實現消息發送功能的完整實戰流程。首先闡述了企業微信API在數字化辦公中的重要性&#xff0c;重點講解了消息發送接口的應用場景。實戰部分分為前期準備、開發環境搭建和具體實現三個環節&#xff0c;包括創建企業微信應…

Linux的小程序——進度條

為了寫出這個小程序我們先來了解幾個知識點(一)回車和換行先以寫作文為例子了解一下&#xff0c;當在一行中寫了一半&#xff0c;由此處位置往下一行的操作叫做換行&#xff0c;回到該行的開頭位置為回車。而在c語言中\n幫我們完成了換行和回車兩個動作&#xff0c;那單純回車是…

在macOS上使用VS Code和Clang配置C++開發環境

本文基于VS Code官方文檔&#xff0c;詳細介紹如何在macOS系統下配置Clang/LLVM編譯器與VS Code的C開發環境。通過本文&#xff0c;你將學會如何搭建開發環境、創建并調試C程序&#xff0c;適合C初學者和需要在macOS上進行C開發的開發者。 前提條件 在開始配置前&#xff0c;…

Ganttable 基于工時的進度分析

時間進度分析是 Ganttable 提供的高級進度管理功能&#xff0c;它基于實際工作時長&#xff0c;結合計劃預估工時&#xff0c;可精準計算項目及任務的完成度。開啟進度分析開啟進度分析功能的操作如下&#xff1a;在時間管理頁面&#xff0c;點擊右上角的 “設置” 按鈕&#x…

duiLib 自定義資源目錄

前面的demo&#xff0c;把布局文件放在默認目錄了&#xff0c;想著應該也可以自定義資源路徑。先debug看下默認目錄是什么路徑。設置調試選項&#xff0c;調試信息格式改為程序數據庫&#xff08;/Zi&#xff09;再調試項目&#xff0c;選中監視1&#xff1a;在監護窗口中查看變…

YOLO-01目標檢測基礎

1、概念目標檢測&#xff08;Object Detection&#xff09;是計算機視覺中的一個重要領域&#xff0c;它涉及到識別圖片或視頻某一幀中的物體是什么類別&#xff0c;并確定它們的位置。通常用于多個物體的識別&#xff0c;可以同時處理圖像中的多個實例&#xff0c;并為每個實例…

Linux->動靜態庫

目錄 引入&#xff1a; 一&#xff1a;動靜態庫的介紹 1&#xff1a;庫的本質 2&#xff1a;庫的類別及優缺點 3&#xff1a;動態鏈接 4&#xff1a;靜態鏈接 二&#xff1a;頭文件和庫的查找 三&#xff1a;靜態庫的制作和使用 1&#xff1a;制作 2&#xff1a;指令打…

【LY88】雙系統指南及避坑

一. Windows重裝&#xff08;前提是Windows可正常使用&#xff0c;優點是無需U盤&#xff09; 1. PE工具和系統鏡像 機械師只只提供的資源鏈接 完成微PE工具的安裝并下載了系統鏡像之后&#xff0c;&#xff08;如果要裝ubuntu的話&#xff09;需確認磁盤分區格式和引導項。前…

Ubuntu22.04.1搭建php運行環境

步驟 1: 更新你的系統 首先&#xff0c;確保你的系統是最新的。打開終端并運行以下命令&#xff1a; sudo apt update sudo apt upgrade步驟 2: 安裝Apache Web服務器 使用Apache作為你的Web服務器。運行以下命令&#xff1a; sudo apt install apache2安裝完成后&#xff0c;你…

防止飛書重復回調通知分布式鎖

## 場景銷售訂單下&#xff0c;明細25明細款&#xff0c;發起飛書審批&#xff0c;飛書設置自動審核通過&#xff0c;導致會收到兩次審核通過通知加了分布式鎖 &#xff0c;仍導致執行業務執行兩遍了String lockKey "feihsu-approvalNotify:" instanceCode; RLock …

數據結構:下三角矩陣(Lower Triangular Matrix)

目錄 什么是下三角矩陣&#xff1f; 我們要存哪些元素&#xff1f;一共幾個&#xff1f; 推導索引映射公式 核心問題&#xff1a;給定 (i,j)&#xff0c;如何計算 k&#xff1f; 什么是下三角矩陣&#xff1f; 一個 n n 的矩陣&#xff0c;如果它在主對角線以上的所有元…

力扣209:長度最小的子數組

力扣209:長度最小的子數組題目思路代碼題目 給定一個含有 n 個正整數的數組和一個正整數 target 。 找出該數組中滿足其總和大于等于 target 的長度最小的 子數組 [numsl, numsl1, …, numsr-1, numsr] &#xff0c;并返回其長度。如果不存在符合條件的子數組&#xff0c;返回…