數據結構一 單鏈表

1.單鏈表

1.數據結構簡介

程序=數據結構+算法

數據

數據(data)是客觀事物的一個符號表示

數據元素(data element)是數據的基本單位,一 個數據元素可以由若干個數據項(data item)組成。數據項是數據不可分割的最小單位。

數據結構

是數據元素之間相互關系的集合

邏輯結構 邏輯層面:同窗

數據元素之間存在的邏輯關系

集合

數據結構中的元素之間除了“同屬一個集合”的相互關系外,別無其他關系

**線性結構: **排隊:一列

數據結構中的元素存在一對一的相互關系,如數組(索引)、鏈表(指針)、棧和隊列(操 作順序)等。

**樹形結構: **排隊:方隊

數據結構中的元素存在一對多的相互關系,如樹和二叉樹(一個父節點對應多個子節點) 等

圖形結構:

數據結構中的元素存在多對多的相互關系,如圖(每個節點都可以與多個節點相連,同時它 也可以被多個節點所連接。)等

物理結構(存儲結構)

數據的物理結構或存儲結構是數據在計算機中的存儲表示或實現

順序結構:

數據元素在物理位置上相鄰,通過元素的存儲地址來表示數據元素之間的邏輯關系,比如數組

鏈表結構:

對邏輯上相鄰的元素不要求其物理位置相鄰,元素間的邏輯關系通過附設的指針域來表示

索引結構:

為每個數據結構建立索引表,每個數據元素占用表中的一項,每個表項通常包含關鍵字和地 址指針 map

散列結構(哈希結構):

根據數據元素的關鍵字通過哈希函數計算出一個數值用作數據元素的存儲地 址,以實現快速查找和插入

2.線性表(邏輯上)

它表示元素之間具有一對一的相鄰關系的數據集合。

線性表的數據元素可以是各種各樣、但是同一個線性表中的元素必須是相同類型

特性:

存在唯一的一個被稱為:"第一個"的數據元素

存在唯一的一個被稱為:“最后一個”的數據元素

除了第一個元素之外,集合中的每一個數據元素前均只有一個節點

除了最后一個元素之外,集合中的每一個數據元素后均只有一個節點

線性表可以是順序結構也可以是鏈表結構.。順序存儲的線性表通常通過數組(Array)實現,而鏈式存儲的線性表則通過鏈表(Linked List)實現

2.1順序存儲的線性表(數組)

在C++中,數組是最簡單的順序存儲的線性表實現。數組中的元素在內存中連續存放,每個元素可以通 過索引(或下標)快速訪問。

例子:

#include <iostream>  
using namespace std;  
int main() 
{  
int arr[5] = {1, 2, 3, 4, 5}; // 定義一個整型數組,大小為5  
for(int i = 0; i < 5; i++) 
{  
cout << arr[i] << " "; // 訪問并打印數組中的每個元素  
}  

上述結構存在一些問題問題:我們在定義數組的時候,需要規定數組的長度,定義好了就不能修改了。

int a[10]; // 定義了一個元素為int類型的數組,數組大小為10個int類型
// 修改數組的大小
a = malloc(sizeof(int) * 100); // 不行的,因為a是常量指針,不能改變a指向。

2.1鏈式存儲的線性表(鏈表)*

鏈表的定義:鏈表就是由一個或者是多個包含指針成員變量結構體.

struct 類型名
{
類型1 變量1; // 數據1...
類型n 變量n; // 數據nstruct 類型名 *指針變量; // 存儲數據元素的地址。在單鏈表結構里面,存儲下一個數據元素的內
存地址
}

通過其指針變量來指向其他同類型結構體內存 地址來形成一種邏輯上的鏈式的數據結構。我們把每一個結構體實例(變量/空間)稱為該鏈表的:節點 (node)

鏈表中的每個元素都是一個節點(Node),節點之間通過指針連接。鏈表分為單向鏈表、雙向鏈表和循 環鏈表等多種類型。

***問題1:***為什么是 struct (結構體)?

因為包含指針成員,,記錄下一個元素的地址。而其他數據類型可能與指針類型不同,因此需要能夠存放 不同數據類型的結構,因此是結構體。

問題2::為什么指針成員是 struct 類型名 *(當前結構體指針類型)?

因為需要存放下一個元素的地址,而下一個元素是 struct 類型名類型的。如果是 struct 類型名,要為當前類型分配空間,因為結構題沒有定義完全**,沒有辦法分配內存**。

struct 類型名 *的話是指針,無論什么類型指針都是分配八個字節。

特殊的節點

***頭節點:***是鏈表中唯一一個沒有前節點、只有后節點的節點,是整個鏈表的第一個節點(開端)。

***尾節點:***是鏈表中唯一一個沒有后節點,只有前節點的節點,是整個鏈表的最后一個節點(結 尾)。因此尾節點的指針指向空( NULL ),以保證尾節點的指針成員不會成為野指針。可以通過判斷 指針是否指向空來判斷是不是查詢到了最后一個元素。

畫個圖
在這里插入圖片描述

2.3鏈表的創建過程

(單鏈表 Singly Linked List)

2.3.1 定義鏈表節點結構

首先,需要定義一個鏈表節點的結構體,該結構體至少包含兩個成員:存儲數據的部分(數據域)和指 向下一個節點的指針(指針域)

//定義鏈表節點結構
typedef struct listNode{int val; // 整型數據  
struct li
2.3.2 初始化鏈表頭指針

在創建鏈表之前,需要初始化鏈表的頭指針。頭指針是一個指向鏈表第一個節點的指針。如果鏈表為 空,則頭指針通常設置為 NULL 。

//初始化鏈表頭指針
ListNode* head = NULL; // 初始化鏈表為空鏈表  

在這里插入圖片描述

創建并添加節點到鏈表

接下來,可以通過創建新的節點并將其插入到鏈表中來構建鏈表。插入操作可以根據需要在鏈表的不同 位置進行(如頭部、尾部或特定位置)。

2.3.3 創建節點
//創建節點 value新節點存儲的數據
//可以是普通結構體變量,但是之后用到的要&listNode *createNode(int value)
{listNode *newNode=new listNode{ value};//動態分配內存,設置新節點的值if(newNode!=NULL){newNode->next=NULL;//新節點的next指針初始化為NULL,沒有后面的元素}return newNode;//此處可以返回局部變量的地址是因為newNode在堆區,生命周期在delete后才結
束}

推薦創建節點時用 new/malloc 在堆區申請節點,而不是棧區。

因為堆區空間由程序員維護,可以控制 其聲明周期,

而棧區內存空間由編譯器維護,無法控制生命周期,有可能內存空間被意外收回。

2.3.4 插入節點

如果頭節點為空,新創建的節點即為頭節點

在這里插入圖片描述

頭插 直接讓新節點指向頭節點,那么新節點就變成了新的頭節點

//頭插 2-3   ->   1-2-3直接讓新節點指向頭節點,新節點變成新的頭節點
//頭部添加節點//希望形參影響實參
listNode *insertNodeAtHead(listNode*head/*頭節點的地址*/,int value/*數據*/)//head是一級指針要有返回值,
// 因為是值傳遞,用返回值更新head指向 二級指針不需要 地址傳遞
{if(head==NULL){//鏈表是空,新節點就是頭節點head=createNode(value);return head;}![屏幕截圖 2025-03-31 065839](D:\筆記\4-2 數據結構 (復習筆記)\屏幕截圖 2025-03-31 065839.png)//創建新節點listNode *newHead=createNode(value);//讓新節點指向頭節點newHead->next=head;//返回新的頭節點return newHead;}

添加頭節點 如果為空直接創建,新節點就是頭節點,如果不為空直接讓新節點指向頭節點,新節點變成新的頭節
在這里插入圖片描述

尾部插入:如果要在鏈表尾部添加節點,需要遍歷鏈表直到最后一個節點,然后將最后一個節 點的next指針指向新節點

//尾部添加節點
listNode *insertNodeAtTail(listNode*head,int value)
{if(head==NULL){//鏈表是空,新節點就是頭節點head=createNode(value);}else{  //定義中間變量,找到尾節點listNode *current=head;while( current->next==NULL){//向后遍歷current==current->next;}//current指向尾節點 ,尾節點next指向新節點current->next=createNode(value);}//返回頭節點 在調用該函數時要用head接受該返回值來更新頭節點return head;}

在這里插入圖片描述

中間插入::按照一定規則在某個位置插入元素

//中間插入(從小到大)
//head:鏈表的頭節點 newNode:插入節點
listNode *insertNodeAtMiddle(listNode*head,int value)
{if(head==NULL){//鏈表是空,新節點就是頭節點head=createNode(value);}else{//比頭節點小, 例如:2-3 頭插if(value<head->val);{// 頭插head=insertNodeAtHead(head,value);//結束return head;}//前面的節點listNode*first=head;//下一個的節點listNode*second=first->next;/*在兩者之間插入 只需要在first和second之間插入 鏈表只有一個元素 first:1 second null 直接摻入first后只要second為空 直接尾插*///first不是尾節點while(second){//判斷相鄰兩個節點的大小關系if(value>first->val&&value<second->val){listNode *newNode =createNode(value);//創建節點//一定是先連接后面節點,在連接前面節點,因為節點只記錄了下一個節點的地址信// 息,如果先連接前面,則后面的地址信息就丟失了//先連接后面的節點,即先連接2-3newNode->next=second;//然后讓前面的節點指向新節點,即1-2first->next=newNode;return head;}//向后遍歷first=second;second=second->next;}//1-2-3   4  尾插head=insertNodeAtTail(head,value);}}

在這里插入圖片描述

附加:

值傳遞和地址傳遞區別-------形參修改會不會影響實參

實參 int 形參 int 值傳遞 形參不會影響實參

實參 int 形參 int* 地址傳遞 形參會影響實參

實參 int* 形參 int* 值傳遞* 形參不會影響實參

2.3.5 刪除鏈表中的節點

將鏈表中某個節點刪除,刪除時要注意,創建節點時申請了內存,刪除時要釋放內存以防止內存泄露, 同時將指針置為空

//刪除節點listNode  *deteleNode(listNode*head,int value)
{if (head==NULL){//如果鏈表是空,結束return 0;}else if(value==head->val){//紀律新的頭節點listNode*newHead=head->next;//刪除頭節點。防止內存泄漏delete head;//更新頭節點head=newHead;}//非頭節點else{listNode*current=head;//遍歷鏈表while(current->next){//只使用一個指針 刪除當前節點的下一個節點if(current->next->val==value){// 當前節點的下一個節點 1-2-3 delete 2 變成1-3listNode* needDeleNode =current->next;//中間節點if(current->next->next ){//更新節點指向current->next= current->next->next;}//尾節點1-2 刪除2 變1else{![屏幕截圖 2025-03-31 070326](D:\筆記\4-2 數據結構 (復習筆記)\屏幕截圖 2025-03-31 070326.png)current->next=NULL;}//刪除下一個節點delete needDeleNode;needDeleNode=NULL;//提前結束return head;}current=current->next;//向后遍歷}}//沒有找到刪除節點信息 return head;}

在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述

鏈表使用完畢記得要刪除所有節點,防止內存泄露

void deinitNode(listNode*&head)
{//判斷鏈表是不是空鏈表if(head==NULL){std::cout<<"鏈表為空"<<std::endl;return ;}listNode *current=head;while(current){//要刪除的節點listNode *needDelNode=current;//遍歷current=current->next;//刪除節點delete  needDelNode;needDelNode=NULL;}}

2. 4 完整代碼

#include <iostream>using namespace std;
//定義鏈表節點結構
typedef struct listNode
{int val;//整形數據struct listNode *next;//指向下一個節點的指針//listNode *next;不行,因為listNode沒有定義出來
}listNode;//創建節點 value新節點存儲的數據
//可以是普通結構體變量,但是之后用到的要&
listNode *createNode(int value)
{listNode *newNode=new listNode{value};//動態分配內存,設置新節點的值if(newNode!=NULL){newNode->next=NULL;//新節點的next指針初始化為NULL,沒有后面的元素}return newNode;}//頭插 2-3   ->   1-2-3直接讓新節點指向頭節點,新節點變成新的頭節點
//頭部添加節點
//希望形參影響實參
listNode *insertNodeAtHead(listNode*head,int value)//head是一級指針要有返回值,// 因為是值傳遞,用返回值更新head指向 二級指針不需要 地址傳遞
{if(head==NULL){//鏈表是空,新節點就是頭節點head=createNode(value);return head;}//創建新節點listNode *newHead=createNode(value);//讓新節點指向頭節點newHead->next=head;//返回新的頭節點return newHead;}
//尾部添加節點
listNode *insertNodeAtTail(listNode*head,int value)
{if(head==NULL){//鏈表是空,新節點就是頭節點head=createNode(value);}else{  //定義中間變量,找到尾節點listNode *current=head;while( current->next){//向后遍歷current=current->next;}//current指向尾節點 ,尾節點next指向新節點current->next=createNode(value);}//返回頭節點 在調用該函數時要用head接受該返回值來更新頭節點return head;}//中間插入(從小到大)
//head:鏈表的頭節點 newNode:插入節點
listNode *insertNodeAtMiddle(listNode*head,int value)
{if(head==NULL){//鏈表是空,新節點就是頭節點head=createNode(value);}else{//比頭節點小, 例如:2-3 頭插if(value<head->val){// 頭插head=insertNodeAtHead(head,value);//結束return head;}//前面的節點listNode*first=head;//下一個的節點listNode*second=first->next;/*在兩者之間插入 只需要在first和second之間插入 鏈表只有一個元素 first:1 second null 直接摻入first后只要second為空 直接尾插*///first不是尾節點while(second){//判斷相鄰兩個節點的大小關系if(value>first->val&&value<second->val){listNode *newNode =createNode(value);//創建節點//一定是先連接后面節點,在連接前面節點,因為節點只記錄了下一個節點的地址信// 息,如果先連接前面,則后面的地址信息就丟失了//先連接后面的節點,即先連接2-3newNode->next=second;//然后讓前面的節點指向新節點,即1-2first->next=newNode;return head;}//向后遍歷first=second;second=second->next;}// listNode*current=head;// while(value)//1-2-3   4  尾插head=insertNodeAtTail(head,value);}return head;
}
//刪除節點listNode  *deteleNode(listNode*head,int value)
{if (head==NULL){//如果鏈表是空,結束return 0;}else if(value==head->val){//紀律新的頭節點listNode*newHead=head->next;//刪除頭節點。防止內存泄漏delete head;//更新頭節點head=newHead;}//非頭節點else{listNode*current=head;//遍歷鏈表while(current->next){//只使用一個指針 刪除當前節點的下一個節點if(current->next->val==value){// 當前節點的下一個節點 1-2-3 delete 2 變成1-3listNode* needDeleNode =current->next;//中間節點if(current->next->next ){//更新節點指向current->next= current->next->next;}//尾節點1-2 刪除2 變1else{delete current->next;current->next=NULL;}//刪除下一個節點delete needDeleNode;needDeleNode=NULL;//提前結束return head;}current=current->next;//向后遍歷}}//沒有找到刪除節點信息 return head;}//打印鏈表
void printtNode(listNode*head)
{//判斷鏈表是不是空鏈表if(head==NULL){std::cout<<"鏈表為空"<<std::endl;return ;}listNode *current=head;//遍歷while (current){std::cout<<current->val<<" ";   //輸出內容current=current->next;}std::cout<<std::endl;
}//清空鏈表
void deinitNode(listNode*&head)
{//判斷鏈表是不是空鏈表if(head==NULL){std::cout<<"鏈表為空"<<std::endl;return ;}listNode *current=head;while(current){//要刪除的節點listNode *needDelNode=current;//遍歷current=current->next;//刪除節點delete  needDelNode;needDelNode=NULL;}}int main()
{// 初始化鏈表頭指針listNode *head=NULL;//初始化鏈表為空鏈表//head=insertNodeAtHead的返回值//插入head=insertNodeAtMiddle(head,1);//頭head=insertNodeAtMiddle(head,5);//尾head=insertNodeAtMiddle(head,3);//中間head=insertNodeAtMiddle(head,4);//中間head=insertNodeAtMiddle(head,2);//中間//打印printtNode(head);//刪除head= deteleNode(head,1);//頭head= deteleNode(head,5);//尾head= deteleNode(head,3);//中間printtNode(head);    //打印//清理鏈表deinitNode(head);//寫完一個驗證一個return 0;}

2.6.數組和鏈表的優缺點:

2.6.1數組

優點:

數組將元素按順序存放在內存中,而且元素的內存占用都是相同的,因為它的地址連 續、所有可以通過下標快速的對數組元素進行訪問。

缺點

有可能造成內存資源的浪費(固定大小) 數組元素的插入和刪除比較復

2.6.2鏈表

優點:

插入和刪除很方便

可以按需分配,不會造成空間的浪費(可有效利用碎片化空間)

缺點:

空間不是連續,訪問相對數組而言效率要低很多碎片化比數組要高(尤其是當插入的數 據是無序的時候)

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

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

相關文章

GPU集群監控系統開發實錄:基于Prometheus+Grafana的算力利用率可視化方案

一、科研場景下的GPU監控痛點 在深度學習模型訓練、分子動力學模擬等科研場景中&#xff0c;GPU集群的算力利用率直接影響著科研效率。筆者在參與某高校計算中心的運維工作時&#xff0c;發現以下典型問題&#xff1a; 資源黑洞現象&#xff1a;多課題組共享GPU時出現"搶…

【計算機視覺】三維重建: MVSNet:基于深度學習的多視圖立體視覺重建框架

MVSNet&#xff1a;基于深度學習的多視圖立體視覺重建框架 技術架構與核心算法1. 算法流程2. 關鍵創新 環境配置與實戰指南硬件要求安裝步驟數據準備&#xff08;DTU數據集&#xff09; 實戰流程1. 模型訓練2. 深度圖推斷3. 點云生成 常見問題與解決方案1. CUDA內存不足2. 特征…

智能家居的OneNet云平臺

一、聲明 該項目只需要創建一個產品&#xff0c;然后這個產品里面包含幾個設備&#xff0c;而不是直接創建幾個產品 注意&#xff1a;傳輸數據使用到了不同的power&#xff0c;還有一定要手機先聯網才能使用云平臺 二、OneNet云平臺創建 &#xff08;1&#xff09;Temperatur…

aidermacs開源程序使用 Aider 在 Emacs 中進行 AI 配對編程

一、軟件介紹 文末提供程序和源碼下載 Aidermacs 通過集成 Aider&#xff08;最強大的開源 AI 配對編程工具之一&#xff09;為 Emacs 帶來了 AI 驅動的開發。如果您缺少 Cursor&#xff0c;但更喜歡生活在 Emacs 中&#xff0c;Aidermacs 提供了類似的 AI 功能&#xff0c;同…

加密算法(一)-對稱加密(DES、AES、3DES、Blowfish、Twofish)一篇了解所有主流對稱加密,輕松上手使用。

一、對稱加密算法 對稱加密算法采用相同的密鑰來進行加密和解密操作。其優點是加密和解密速度快&#xff0c;不過密鑰的管理和分發存在一定的安全風險。 1.1、DES(已不推薦使用) 這是早期的對稱加密算法&#xff0c;密鑰長度為 56 位。但由于密鑰長度較短&#xff0c;如今已不…

深度優先VS廣度優先:算法選擇的核心邏輯與實戰指南

摘要 深度優先搜索&#xff08;DFS&#xff09;與廣度優先搜索&#xff08;BFS&#xff09;是圖結構遍歷與路徑分析的基礎算法&#xff0c;也是最常見的搜索框架&#xff0c;在路徑規劃、社交網絡分析、游戲AI等領域均有廣泛應用。本文從算法思想、數據結構選擇、時空復雜度和…

2025深圳杯、東三省數學建模B題數模AI全網專業性第一

為什么選擇使用我的數模AI&#xff1f; 1.輕松輔導學生 2.小白也能翻身碾壓大佬 3.突破知識壁壘&#xff0c;縮短與大佬的差距&#xff0c;打破不公平的教學資源&#xff0c;扭轉差距 4.輔助商業服務&#xff0c;成本低 5.大模型本身有一定隨機性&#xff0c;所以也不用擔心…

使用MGeo模型高精度實現文本中地址識別

一、功能與安裝 1、模型地址 模型是阿里開發的門址高精度識別模型。 https://modelscope.cn/models/iic/mgeo_geographic_elements_tagging_chinese_base/summary 注意&#xff1a;不能自己安裝包&#xff0c;沒法解決依賴問題&#xff0c;直接按照官方要求安裝下面的包&am…

【Vue】Vue與UI框架(Element Plus、Ant Design Vue、Vant)

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;Vue 文章目錄 1. Vue UI 框架概述1.1 主流Vue UI框架簡介1.2 選擇UI框架的考慮因素 2. Element Plus詳解2.1 Element Plus基礎使用2.1.1 安裝與引入2.1.2 基礎組件示例 2.2 Element Plus主題定制2.3 Element Plus的優缺點分析 3…

MLPerf基準測試工具鏈定制開發指南:構建領域特異性評估指標的實踐方法

引言&#xff1a;基準測試的領域適配困局 MLPerf作為機器學習性能評估的"黃金標準"&#xff0c;其通用基準集在實際科研中常面臨?領域適配鴻溝?&#xff1a;醫療影像任務的Dice系數缺失、NLP場景的困惑度指標偏差等問題普遍存在。本文通過逆向工程MLPerf v3.1工具…

好看的個人主頁HTML源碼分享

源碼介紹 好看的個人主頁HTML源碼分享&#xff0c;源碼由HTMLCSSJS組成&#xff0c;記事本打開源碼文件可以進行內容文字之類的修改&#xff0c;雙擊html文件可以本地運行效果 效果預覽 源碼獲取 好看的個人主頁HTML源碼分享

mac word接入deepseek

網上大多使用Windows版word來接入deepseek&#xff0c;vba文件引入mac后&#xff0c;因底層工具不同&#xff0c;難以直接運行&#xff0c;例如CreateObject("MSXML2.XMLHTTP")無法創建&#xff0c;為此寫了一版新的vba&#xff0c;基于mac底層工具來實現。 vba文件點…

React Native 入門 jsx tsx 基礎語法

React Native 入門 jsx 基礎語法 JSX 介紹 JSX (JavaScript XML) 是一種 JavaScript 的語法擴展&#xff0c;允許你在 JavaScript 文件中編寫類似 HTML 的代碼。它是 React 和 React Native 應用程序中用來描述 UI 的主要方式。 JSX 的特點 JSX 看起來像 HTML&#xff0c;但…

HDLBIT-程序(Procedures)

始終塊(組合)【Always blocks(combinational)】 答案: Always blocks (clocked) 答案&#xff1a; module top_module(input clk,input a,input b,output wire out_assign,output reg out_always_comb,output reg out_always_ff );assign out_assigna^b;always(*)beginout_a…

值此五一勞動節來臨之際,

值此五一勞動節來臨之際&#xff0c;謹向全體員工致以節日的問候與誠摯的感謝&#xff01;正是你們的敬業與奮斗&#xff0c;成就了今天的成績。愿大家節日愉快&#xff0c;闔家幸福&#xff0c;身體健康&#xff01; #北京先智先行科技有限公司 #先知AI #節日快樂

【經管數據】A股上市公司資產定價效率數據(2000-2023年)

數據簡介&#xff1a;資產定價效率是衡量市場是否能夠有效、準確地反映資產內在價值的重要指標。在理想的市場條件下&#xff0c;資產的市場價格應該與其內在價值保持一致&#xff0c;即市場定價效率達到最高。然而&#xff0c;在實際市場中&#xff0c;由于信息不對稱、交易摩…

云蝠智能大模型智能呼叫:賦能零售行業服務,助力客戶增長

在數字化浪潮席卷全球的今天&#xff0c;零售行業正面臨前所未有的變革壓力。消費者需求日益個性化、市場競爭愈發激烈&#xff0c;傳統的人工客服模式已難以滿足企業對高效觸達、精準營銷和極致體驗的需求。而云蝠智能大模型智能呼叫系統&#xff0c;憑借其突破性的AI技術和深…

IP 互聯網協議

IP&#xff08;Internet Protocol&#xff0c;互聯網協議&#xff09;是網絡通信中的核心協議之一&#xff0c;屬于網絡層協議。它的主要功能是提供數據包的尋址、路由以及傳輸。IP協議負責將數據從源主機傳輸到目標主機&#xff0c;并在網絡中進行轉發。在網絡通信中&#xff…

報文三次握手對么?(?^o^?)?

論TCP報文三次握手機制的理論完備性與工程實踐價值&#xff1a;基于網絡通信協議棧的深度剖析 在計算機網絡領域&#xff0c;傳輸控制協議&#xff08;TCP&#xff09;作為實現可靠數據傳輸的核心協議&#xff0c;其連接建立階段的三次握手機制歷來是網絡工程與協議理論研究的…

HarmonyOS NEXT第一課——HarmonyOS介紹

一、什么是HarmonyOS 萬物互聯時代應用開發的機遇、挑戰和趨勢 隨著萬物互聯時代的開啟&#xff0c;應用的設備底座將從幾十億手機擴展到數百億IoT設備。全新的全場景設備體驗&#xff0c;正深入改變消費者的使用習慣。 同時應用開發者也面臨設備底座從手機單設備到全場景多設…