【數據結構】線性表--鏈表

【數據結構】線性表--鏈表

  • 一.前情回顧
  • 二.鏈表的概念
  • 三.鏈表的實現
    • 1.鏈表結點的結構:
    • 2.申請新結點函數:
    • 3.尾插函數:
    • 4.頭插函數:
    • 5.尾刪函數:
    • 6.頭刪函數:
    • 7.在指定結點之前插入:
    • 8.在指定結點之后插入:
    • 8.刪除指定結點:
    • 9.查找函數:
    • 10.銷毀鏈表:
  • 四.全部源代碼實現
    • 1.頭文件(聲明動態順序表的結構,操作等,起到目錄作用):
    • 2.源文件(具體實現各種操作):
    • 3.測試文件(測試各個函數的功能)
  • 五.單鏈表和順序表的對比
    • 1.存儲分配方式
    • 2.時間性能
    • 3.空間性能
    • 4.總結

一.前情回顧

上篇文章講述了動態順序表及其實現,我們知道了動態順序表在物理結構上是連續的,因此我們也認識到它的缺點:
①如果空間不足需進行增容,付出一定的性能消耗,并且可能存在一定的空間浪費。
②在進行某些插入或刪除操作時,需要大量移動數據。這是因為相鄰數據元素在物理存儲結構上也是連續存儲的,中間沒有空隙。
在這里插入圖片描述

因此本篇文章將講述線性表的另一種表示方法:鏈表。

二.鏈表的概念

鏈表,即線性表的鏈式實現,指用一組任意連續或者不連續的存儲單元存儲數據,通過指針像鏈條一樣鏈結各個元素的一種存儲結構。
如圖所示:
在這里插入圖片描述

因此,對于每個數據元素,除了要存儲自身信息,也要存儲后繼(下一個)數據元素的信息。這兩部分合起來被稱為結點。
每個結點包含兩個域,一個是數據域:存儲數據元素的信息;另一個是指針域:存儲后繼元素的位置信息。n個結點鏈結成一個鏈表。如圖所示:
在這里插入圖片描述
對于線性表,總要有頭有尾,我們把鏈表中第一個結點的存儲位置叫做頭指針,最后一個結點置為NULL。由于每個結點的指針域只包含一個指向后繼位置的指針,因此該鏈表又稱單鏈表(單向鏈表)。

三.鏈表的實現

1.鏈表結點的結構:

在C語言中用結構體指針來存儲后繼結點的信息。

typedef int SLDataType;//結點的結構體
typedef struct SListNode
{SLDataType data;//數據域struct SListNode* next;//指向下一個結點的指針域,所以指針類型應該為struct SListNode*
}SLTNode;//起別名,將struct SListNode簡寫成SLTNode

2.申請新結點函數:

因為在插入操作中需要頻繁申請結點,因此可以將申請結點的操作封裝成一個函數。

//申請新結點
SLTNode* BuySListNode(SLDataType x)
{SLTNode* NewNode = (SLTNode*)malloc(sizeof(SLTNode));NewNode->data = x;NewNode->next = NULL;return NewNode;
}

3.尾插函數:

需要特別注意的是,凡是涉及修改鏈表,必須傳二級指針,因為鏈表本身是用每個結點的指針鏈結而成的,作為參數傳遞時是一級指針,再將每個結點的地址作為實參傳遞,這是二級指針。

//尾插函數
//需要傳二級指針,否則形參的改變不影響實參
void SListPushBack(SLTNode** pphead, SLDataType x)
{assert(pphead);//不能傳空地址,否則解引用找鏈表頭結點會報錯//創建新結點SLTNode* NewNode = (SLTNode*)malloc(sizeof(SLTNode));NewNode->data = x;NewNode->next = NULL;//鏈表為空,直接插入if (*pphead == NULL){*pphead = NewNode;}else{//需要找到最后一個結點才能尾插,因此先用一個cur結點標記當前所在位置SLTNode* cur = *pphead;while (cur->next != NULL)//循環結束走到最后一個結點{cur = cur->next;//讓cur遍歷到最后一個結點}if (NewNode == NULL){perror("malloc fail!");exit(1);}cur->next = NewNode;}
}

4.頭插函數:

//頭插函數
void SListPushFront(SLTNode** pphead, SLDataType x)
{assert(pphead);//創建新結點SLTNode* NewNode = BuySListNode(x);NewNode->next = *pphead;*pphead = NewNode;
}

5.尾刪函數:

//尾刪函數
void SListPopBack(SLTNode** pphead)
{assert(pphead && *pphead);//如果只有一個結點if ((*pphead)->next == NULL){free(*pphead);*pphead = NULL;}else{SLTNode* cur = *pphead;while (cur->next->next != NULL)//需要找到倒數第二個結點才能刪除最后一個結點{cur = cur->next;}SLTNode* tmp = cur->next;free(tmp);tmp = NULL;cur->next = NULL;}
}

6.頭刪函數:

//頭刪函數
void SListPopFront(SLTNode** pphead)
{assert(pphead&&*pphead);//鏈表為空時不能刪除SLTNode* next = (*pphead)->next;free(*pphead);*pphead = next;}

7.在指定結點之前插入:

//在指定結點之前插入函數
void SListInsert(SLTNode** pphead, SLTNode* pos, SLDataType x)
{assert(pphead && *pphead);assert(pos);//需要找到指定結點的前一個結點SLTNode* prev = *pphead;//可能第一個結點就是指定結點,此時相當于頭插if (prev == pos){//直接調用頭插函數SListPushFront(pphead, x);}else{while (prev->next != pos){prev = prev->next;}SLTNode* NewNode = BuySListNode(x);NewNode->next = prev->next;prev->next = NewNode;}
}

8.在指定結點之后插入:

//在指定結點之后插入函數
void SListInsertAfter(SLTNode** pphead, SLTNode* pos, SLDataType x)
{assert(pphead && *pphead);assert(pos);SLTNode* NewNode = BuySListNode(x);NewNode->next = pos->next;pos->next = NewNode;
}

8.刪除指定結點:

//刪除指定結點
void SListErase(SLTNode** pphead, SLTNode* pos)
{SLTNode* prev = *pphead;//如果第一個結點就是要刪除的結點if (prev == pos){//直接調用頭刪SListPopFront(pphead);}else{while (prev->next != pos){prev = prev->next;}SLTNode* tmp = prev->next;//tmp即要刪除的結點prev->next = tmp->next;free(tmp);tmp = NULL;}
}

9.查找函數:

//查找
SLTNode* SListFind(SLTNode* phead, SLDataType x)
{SLTNode* cur = phead;while (cur != NULL){if (cur->data == x)return cur;cur = cur->next;}//沒找到或鏈表為空時,返回空指針return NULL;
}

10.銷毀鏈表:

//銷毀鏈表函數
void SListDestory(SLTNode** pphead)
{assert(pphead && *pphead);while (*pphead != NULL){SLTNode* tmp = *pphead;*pphead = (*pphead)->next;free(tmp);tmp = NULL;}
}

四.全部源代碼實現

1.頭文件(聲明動態順序表的結構,操作等,起到目錄作用):

SList.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>typedef int SLDataType;//結點的結構體
typedef struct SListNode
{SLDataType data;//數據域struct SListNode* next;//指向下一個結點的指針域,所以指針類型應該為struct SListNode*
}SLTNode;//起別名,將struct SListNode簡寫成SLTNode//打印函數(方便調試)
void SListPrint(SLTNode* phead);//申請新結點
SLTNode* BuySListNode(SLDataType x);//尾插函數
void SListPushBack(SLTNode** pphead, SLDataType x);//需要傳二級指針,否則形參的改變不影響實參//頭插函數
void SListPushFront(SLTNode** pphead, SLDataType x);//尾刪函數
void SListPopBack(SLTNode** pphead);//頭刪函數
void SListPopFront(SLTNode** pphead);//在指定位置之前插入函數
void SListInsert(SLTNode** pphead, SLTNode* pos, SLDataType x);//在指定位置之后插入函數
void SListInsertAfter(SLTNode** pphead, SLTNode* pos, SLDataType x);//刪除指定結點
void SListErase(SLTNode** pphead, SLTNode* pos);//查找
SLTNode* SListFind(SLTNode* phead, SLDataType x);//銷毀鏈表函數
void SListDestory(SLTNode** pphead);

2.源文件(具體實現各種操作):

SList.c

#include"SList.h"//打印函數(方便調試)
void SListPrint(SLTNode* phead)
{assert(phead);SLTNode* cur = phead;while (cur != NULL)//循環結束走到空結點{printf(" %d ->", cur->data);cur = cur->next;}printf("NULL\n");
}//申請新結點
SLTNode* BuySListNode(SLDataType x)
{SLTNode* NewNode = (SLTNode*)malloc(sizeof(SLTNode));NewNode->data = x;NewNode->next = NULL;return NewNode;
}//尾插函數
//需要傳二級指針,否則形參的改變不影響實參
void SListPushBack(SLTNode** pphead, SLDataType x)
{assert(pphead);//不能傳空地址,否則解引用找鏈表頭結點會報錯//創建新結點SLTNode* NewNode = BuySListNode(x);//鏈表為空,直接插入if (*pphead == NULL){*pphead = NewNode;}else{//需要找到最后一個結點才能尾插,因此先用一個cur結點標記當前所在位置SLTNode* cur = *pphead;while (cur->next != NULL)//循環結束走到最后一個結點{cur = cur->next;//讓cur遍歷到最后一個結點}if (NewNode == NULL){perror("malloc fail!");exit(1);}cur->next = NewNode;}
}//頭插函數
void SListPushFront(SLTNode** pphead, SLDataType x)
{assert(pphead);//創建新結點SLTNode* NewNode = BuySListNode(x);NewNode->next = *pphead;*pphead = NewNode;
}//尾刪函數
void SListPopBack(SLTNode** pphead)
{assert(pphead && *pphead);//如果只有一個結點if ((*pphead)->next == NULL){free(*pphead);*pphead = NULL;}else{SLTNode* cur = *pphead;while (cur->next->next != NULL)//需要找到倒數第二個結點才能刪除最后一個結點{cur = cur->next;}SLTNode* tmp = cur->next;free(tmp);tmp = NULL;cur->next = NULL;}
}//頭刪函數
void SListPopFront(SLTNode** pphead)
{assert(pphead&&*pphead);//鏈表為空時不能刪除SLTNode* next = (*pphead)->next;free(*pphead);*pphead = next;
}//在指定結點之前插入函數
void SListInsert(SLTNode** pphead, SLTNode* pos, SLDataType x)
{assert(pphead && *pphead);assert(pos);//需要找到指定結點的前一個結點SLTNode* prev = *pphead;//可能第一個結點就是指定結點,此時相當于頭插if (prev == pos){//直接調用頭插函數SListPushFront(pphead, x);}else{while (prev->next != pos){prev = prev->next;}SLTNode* NewNode = BuySListNode(x);NewNode->next = prev->next;prev->next = NewNode;}
}//在指定結點之后插入函數
void SListInsertAfter(SLTNode** pphead, SLTNode* pos, SLDataType x)
{assert(pphead && *pphead);assert(pos);SLTNode* NewNode = BuySListNode(x);NewNode->next = pos->next;pos->next = NewNode;
}//刪除指定結點
void SListErase(SLTNode** pphead, SLTNode* pos)
{SLTNode* prev = *pphead;//如果第一個結點就是要刪除的結點if (prev == pos){//直接調用頭刪SListPopFront(pphead);}else{while (prev->next != pos){prev = prev->next;}SLTNode* tmp = prev->next;//tmp即要刪除的結點prev->next = tmp->next;free(tmp);tmp = NULL;}
}//查找
SLTNode* SListFind(SLTNode* phead, SLDataType x)
{SLTNode* cur = phead;while (cur != NULL){if (cur->data == x)return cur;cur = cur->next;}//沒找到或鏈表為空時,返回空指針return NULL;
}//銷毀鏈表函數
void SListDestory(SLTNode** pphead)
{assert(pphead && *pphead);while (*pphead != NULL){SLTNode* tmp = *pphead;*pphead = (*pphead)->next;free(tmp);tmp = NULL;}
}

3.測試文件(測試各個函數的功能)

test.c

#include"SList.h"//測試尾插函數
void test01()
{SLTNode* phead = NULL;SListPushBack(&phead, 1);SListPushBack(&phead, 2);SListPushBack(&phead, 3);SListPushBack(&phead, 4);SListPrint(phead);
}//測試頭插函數
void test02()
{SLTNode* phead = NULL;SListPushFront(&phead, 1);SListPushFront(&phead, 2);SListPushFront(&phead, 3);SListPushFront(&phead, 4);SListPrint(phead);
}//測試尾刪函數
void test03()
{SLTNode* phead = NULL;SListPushBack(&phead, 1);SListPushBack(&phead, 2);SListPushBack(&phead, 3);SListPushBack(&phead, 4);SListPrint(phead);SListPopBack(&phead);SListPrint(phead);SListPopBack(&phead);SListPrint(phead);SListPopBack(&phead);SListPrint(phead);
}//測試頭刪函數
void test04()
{SLTNode* phead = NULL;SListPushFront(&phead, 1);SListPushFront(&phead, 2);SListPushFront(&phead, 3);SListPushFront(&phead, 4);SListPrint(phead);SListPopFront(&phead);SListPrint(phead);SListPopFront(&phead);SListPrint(phead);SListPopFront(&phead);SListPrint(phead);SListPopFront(&phead);SListPrint(phead);SListPopFront(&phead);SListPrint(phead);
}//測試查找函數
void test05()
{SLTNode* phead = NULL;SListPushFront(&phead, 1);SListPushFront(&phead, 2);SListPushFront(&phead, 3);SListPushFront(&phead, 4);SListPrint(phead);SLTNode* ret1 = SListFind(phead, 2);if (ret1 != NULL)printf("找到了\n");elseprintf("未找到\n");SLTNode* ret2 = SListFind(phead, 57);if (ret2 != NULL)printf("找到了\n");elseprintf("未找到\n");
}//測試在指定結點之前插入
void test06()
{SLTNode* phead = NULL;SListPushBack(&phead, 1);SListPushBack(&phead, 2);SListPushBack(&phead, 3);SListPushBack(&phead, 4);SListPrint(phead);//在第三個結點前插入57//先查找到第三個結點SLTNode* pos1 = SListFind(phead, 3);SListInsert(&phead, pos1, 57);SListPrint(phead);//在第一個結點前插入79//先查找到第一個結點SLTNode* pos2 = SListFind(phead, 1);SListInsert(&phead, pos2, 79);SListPrint(phead);//在最后一個結點前插入36//先查找到最后一個結點SLTNode* pos3 = SListFind(phead, 4);SListInsert(&phead, pos3, 36);SListPrint(phead);
}//測試在指定結點之后插入
void test07()
{SLTNode* phead = NULL;SListPushBack(&phead, 1);SListPushBack(&phead, 2);SListPushBack(&phead, 3);SListPushBack(&phead, 4);SListPrint(phead);//在第三個結點后插入57//先查找到第三個結點SLTNode* pos1 = SListFind(phead, 3);SListInsertAfter(&phead, pos1, 57);SListPrint(phead);//在第一個結點后插入79//先查找到第一個結點SLTNode* pos2 = SListFind(phead, 1);SListInsertAfter(&phead, pos2, 79);SListPrint(phead);//在最后一個結點后插入36//先查找到最后一個結點SLTNode* pos3 = SListFind(phead, 4);SListInsertAfter(&phead, pos3, 36);SListPrint(phead);
}//測試刪除結點函數
void test08()
{SLTNode* phead = NULL;SListPushBack(&phead, 1);SListPushBack(&phead, 2);SListPushBack(&phead, 3);SListPushBack(&phead, 4);SListPrint(phead);//刪除第一個結點SLTNode* pos1 = SListFind(phead, 1);SListErase(&phead, pos1);SListPrint(phead);//刪除第三個結點SLTNode* pos2 = SListFind(phead, 3);SListErase(&phead, pos2);SListPrint(phead);//刪除最后一個結點SLTNode* pos3 = SListFind(phead, 4);SListErase(&phead, pos3);SListPrint(phead);
}//測試銷毀函數
void test09()
{SLTNode* phead = NULL;SListPushBack(&phead, 1);SListPushBack(&phead, 2);SListPushBack(&phead, 3);SListPushBack(&phead, 4);SListPrint(phead);SListDestory(&phead);SListPrint(phead);
}
int main()
{//test01();//test02();//test03();//test04();//test05();//test06();//test07();//test08();test09();return 0;
}

五.單鏈表和順序表的對比

1.存儲分配方式

順序表采用一段連續的存儲單元存儲數據元素。
單鏈表采用一組任意的存儲單元存儲元素。

2.時間性能

查找:
順序表按值查找O(n),按索引查找O(1)。
單鏈表O(n)。
插入和刪除:
順序表O(n)。
單鏈表O(1)。

3.空間性能

順序表需要預分配空間,小了需再次分配,大了造成空間浪費。
單鏈表需要時申請結點空間。

4.總結

若線性表需要頻繁查找,宜采用順序存儲結構。若頻繁插入和刪除,宜采用鏈式存儲結構。比如說游戲開發中,對于用戶注冊的個人信息,除了注冊時插入數據外,絕大多數情況都是讀取,所以應該考慮用順序存儲結構 。而游戲中的玩 家的武器或者裝備列表,隨著玩家的游戲過程中,可能會隨時增加或刪除,此時再用順序存儲就不大合適了,鏈表結構就可以大展拳腳。當然,這只是簡單的類比,現實中的軟件開發,要考慮的問題會復雜得多。
總之,線性表的順序存儲和鏈式存儲各有優缺點,不能簡單說哪個好,哪個不好,需根據實際情況做出選擇。

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

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

相關文章

Mybatis-plus代碼生成器的創建使用與詳細解釋

Mybatis-plus代碼生成器的創建使用與詳細解釋 一、代碼生成器概述 1. 定義(什么是代碼生成器) 在軟件開發過程中&#xff0c;存在大量重復性的代碼編寫工作&#xff0c;例如實體類、Mapper 接口、Service 接口及實現類等。代碼生成器就是為了解決這類問題而誕生的工具。MyBa…

drawDB:打造高效數據庫設計流程

drawDB&#xff1a;打造高效數據庫設計流程 drawDB 簡介資源鏈接 核心功能詳解1. 直觀的實體關系圖設計2. SQL 腳本生成3. SQL 導入功能4. 本地化存儲與分享功能5. 自定義主題與外觀 安裝和使用教程本地開發環境搭建構建生產版本Docker 部署基本使用方法 應用場景和實際價值適用…

基于 ESP32 和 GC9D01 0.71寸TFT屏幕的逼真眼睛與寫輪眼動態顯示

近期&#xff0c;我利用 ESP32 和 GC9D01 0.71’TFT 進行了一次有趣的顯示項目開發&#xff0c;成功實現了在該小尺寸屏幕上繪制逼真眼睛和寫輪眼的效果。 硬件準備 主控板 &#xff1a;ESP32&#xff0c;具備強大的處理能力和豐富的接口資源&#xff0c;能夠高效地處理圖像數…

LeetCode58_最后一個單詞的長度

LeetCode58_最后一個單詞的長度 標簽&#xff1a;#字符串Ⅰ. 題目Ⅱ. 示例 0. 個人方法 標簽&#xff1a;#字符串 Ⅰ. 題目 給你一個字符串 s&#xff0c;由若干單詞組成&#xff0c;單詞前后用一些空格字符隔開。返回字符串中 最后一個 單詞的長度。 單詞 是指僅由字母組成、…

論文閱讀:MAXIM Multi-Axis MLP for Image Processing

這是 2022 CVPR 上的一篇文章&#xff0c;介紹了用 MLP 做 low-level 圖像處理的工作 Abstract 近年來&#xff0c;Transformer 和多層感知機&#xff08;MLP&#xff09;模型的發展為計算機視覺任務提供了新的網絡架構設計。盡管這些模型在圖像識別等許多視覺任務中已被證明…

PostgreSQL初試

文章目錄 1 PostgreSQL 簡介2 PostgreSQL 與 MySQL 的區別3 PostgreSQL 的安裝1_Linux部署2_容器化部署 4 PostgreSQL的配置1_遠程連接配置2_配置數據庫的日志3_設置數據庫密碼 5 PostgreSQL 基本操作1_用戶操作2_權限操作3_創建一個自己的用戶4_差異補充 6 安裝圖形化界面1_使…

Fortran語言,do-end do循環,相互包含測試,自動性能優化

1&#xff09;上代碼 !$omp parallel private(n, j, dx, dy, dz, r, a)do n 1, nsteps!$omp dodo i 0, nparticles - 1x_tmp(i) x(i) vx(i) * dty_tmp(i) y(i) vy(i) * dtz_tmp(i) z(i) vz(i) * dtdo j 0, nparticles - 1dx x(j) - x(i)dy y(j) - y(i)dz z(j) - z(…

Cona編譯問題

問題描述 Clion 使用conan插件配置了C工程&#xff0c;然后想通過命令行進行編譯執行。 出現以下錯誤 CMake Error at /usr/local/Cellar/cmake/3.30.1/share/cmake/Modules/CMakeDetermineSystem.cmake:152 (message):Could not find toolchain file: conan_toolchain.cmake…

Qt實現 hello world + 內存泄漏(5)

文章目錄 實現hello world的兩種方式通過圖形化的方式通過純代碼的方式1. 新老頭文件的說明2.堆或棧上創建對象的選擇3.QString的說明 內存泄漏問題 實現hello world的兩種方式 通過圖形化的方式 通過圖形化的方式&#xff0c;在界面上創建出一個控件&#xff0c;顯示出hello …

【翻譯、轉載】【譯文】模型上下文協議(Model Context Protocol, MCP)簡介

原文地址&#xff1a; https://michaelwapp.medium.com/model-context-protocol-mcp-an-introduction-guide-25736f3dd672 在人工智能和 AI 驅動應用日新月異的格局中&#xff0c;一種與大型語言模型&#xff08;LLM&#xff09;交互的新方式正在興起。隨著 AI 智能體&#x…

[方法論]軟件工程中的軟件架構設計:從理論到實踐的深度解析

文章目錄 軟件架構設計&#xff1a;從理論到實踐的深度解析引言一、軟件架構設計的核心目標體系1.1 質量屬性矩陣1.2 架構權衡藝術 二、架構設計方法論演進2.1 傳統設計范式2.2 現代架構方法論2.3 設計模式演化路徑 三、主流架構風格全景圖3.1 單體架構&#xff08;Monolithic&…

【win11 】win11 鍵盤測試

我的鍵盤是支持mac和win的&#xff0c;fn tab 就能切換&#xff0c;有可能是用錯了模式&#xff0c;導致 我alt a 就會彈出 win11的 wifi 等菜單控制 鍵盤測試網站 https://keyboard.bmcx.com/ 識別到我按下的是alt

Linux環境部署iview-admin項目

環境&#xff1a;阿里云服務 系統&#xff1a;CentOS7.X系統 1、下載源碼安裝包 wget https://nodejs.org/dist/v14.17.3/node-v14.17.3-linux-x64.tar.xz2、解壓并放入指定目錄 tar -xf node-v14.17.3-linux-x64.tar.xz && mv node-v14.17.3-linux-x64 /usr/local/no…

VSCode常用插件推薦

文章目錄 VSCode常用插件推薦1 Git相關插件2 代碼格式3 AI工具4 語言插件通用工具參考 VSCode常用插件推薦 1 Git相關插件 2 代碼格式 3 AI工具 4 語言插件 通用工具 參考 50 個 VSCode 必裝插件推薦 https://mp.weixin.qq.com/s/b_OKvg3hdavtnv7pbWcKWg

【Unity】使用XLua進行熱修復

準備工作&#xff1a; &#xff08;1&#xff09;將XLua的Tool拖入Asset &#xff08;2&#xff09;配置熱修復 &#xff08;3&#xff09;運行Genrate Code &#xff08;4&#xff09;運行Hotfix Inject In Editor 編寫腳本&#xff08;注意類上帶有[Hotfix]&#xff09; [Hot…

javaEE——單例模式

目錄 前言1.概念2. 實現3. 比較和改進總結 前言 本篇文章來介紹單例模式&#xff0c;并講述在保證線程安全的前提下&#xff0c;單例模式的寫法。 1.概念 單例模式是一種設計模式&#xff0c;可以說是寫代碼的一種模板&#xff0c;如果在一些固定的場景下按照設計模式進行寫…

TS 對象類型

給對象添加類型注解 ![在這里插入圖片描述(https://i-blog.csdnimg.cn/direct/6c413992c11142d88106633ec442b905.png) 格式&#xff1a;數據類型名:類型別名 注意&#xff1a;對象類型限制使用分號&#xff0c;如果對象中存在方法就寫成&#xff1a;方法&#xff08;&#x…

C++類_虛基類

在 C 里&#xff0c;虛基類是用來解決菱形繼承問題的。菱形繼承問題是指當一個派生類從兩個或更多基類派生&#xff0c;而這些基類又從同一個基類派生時&#xff0c;派生類會包含多份間接基類的數據副本&#xff0c;這可能會引發數據冗余和二義性問題。虛基類可以保證在派生類中…

詳細案例,集成算法

以下是一個使用 隨機森林&#xff08;RF&#xff09; 和 XGBoost 解決結構化數據分類問題的完整案例&#xff08;以泰坦尼克號生存預測為例&#xff09;&#xff0c;包含數據處理、建模和結果分析&#xff1a; 案例&#xff1a;泰坦尼克號乘客生存預測 目標&#xff1a;根據乘客…

《C#數據結構與算法》—201線性表

線性表的實現方式 順序表 線性表的順序存儲是指在內存中用一塊地址連續的空間依次存放線性表的數據元素&#xff0c;用這種方式存儲的線性表叫順序表。 特點&#xff1a;表中相鄰的數據元素在內存中存儲位置也相鄰。 順序表接口實現&#xff1a; 方法名參數返回值描述GetLen…