day19 鏈表

定義

鏈式存儲的線性表

頭文件相關定義?

typedef int datatype;//定義數據域類型
typedef struct Node
{union{int len;  //頭結點數據域datatype data; //普通節點數據域};struct Node *next;   //節點指針域
}Node,*Node_ptr;

鏈表的函數?


注意事項?

1.創建節點時,需要初始化節點的數據域指針域

2.創建節點后需要判斷地址查看是否創建成功

3.無論是聲明何種函數都需要判斷頭節點是否為空

? ? 如果長度發生改變需要添加長度邏輯

? ? ? ? //判斷邏輯

? ? ? ? //功能邏輯

? ? ? ? (長度邏輯)

? ? ? ? //返回邏輯

4.任意位置的增刪改查都需要判斷插入位置是否合理

5.釋放節點后,需要將指針置空防止野指針

6.遍歷下一個節點的操作為p=p->next;

7.理解鏈表反轉

8.節點不允許增刪改查

創建單向鏈表

Node_ptr linklist_create();

函數功能:從堆區空間申請一個頭結點并初始化并檢查鏈表是否創建成功

參數:void

返回值:成功返回頭結點地址失敗返回NULL

?主要代碼

Node_ptr l=(Node_ptr)malloc(sizeof(Node));
if(l==NULL)
{printf("創建鏈表失敗\n");return NULL;		
}
//頭結點初始化
l->len=0;//初始化長度為0
l->next=NULL;//初始化指針為空,防止野指針

鏈表判空操作

int link_empty(Node_ptr );

函數功能:判斷鏈表是否為空

參數:鏈表頭結點地址

返回值:為空返回1,否則返回0

?主要代碼

//通過判斷頭結點的后繼節點指針是否為空
return l->next==NULL; 

創建節點

Node_ptr Node_apply(datatype );

函數功能:從堆區申請一個新節點并判斷是否申請成功,并初始化數據域

參數:節點數據域的值

返回值:成功返回節點地址,失敗返回NULL

?主要代碼

//堆區申請空間
Node_ptr p=(Node_ptr)malloc(sizeof(Node));
if(p==NULL)
{printf("節點空間申請失敗\n");return NULL;
}
printf("節點申請成功\n");
p->data=e; //初始化數據域
p->next=NULL; //初始化指針為空
return p; //封裝好的節點地址

單向鏈表頭插

int link_insert_head(Node_ptr ,datatype );

函數功能:通過創建節點函數申請節點,并在鏈表頭部插入新節點

參數:鏈表頭結點地址、待插入數據

返回值:成功返回0,失敗返回-1

//創建節點
//pa指針接收節點的地址
Node_ptr pa=Node_apply(e);
if(pa==NULL)
{printf("插入失敗\n");return -1;
}
//頭插邏輯
pa->next=L->next;//先繼承頭節點的指向
L->next=pa;  //再將頭節點指針指向插入的節點
//長度自增
L->len++;

單向鏈表按位置查找

Node_ptr link_find_post(Node_ptr ,int );

函數功能:先判斷位置是否合理,根據位置查找節點地址

參數:鏈表頭結點地址、位置索引(從0開始)

返回值:成功返回節點地址,失敗返回NULL

主要代碼?

//判斷邏輯
if(L==NULL||post<0||post>L->len)
{printf("查找失敗\n");return NULL;
}
//查找邏輯
Node_ptr q=L; //定義一個遍歷指針
for(int i=0;i<post;i++) //先移動再自加,所有不需要等于post
{q=q->next;//指向下一個節點
}
//返回節點
return q;

鏈表遍歷

void show(Node_ptr );

函數功能:先判斷是否為空,再打印鏈表中所有節點的數據

參數:鏈表頭結點地址

返回值:void

?主要代碼

//判斷邏輯
if(link_empty(L))
{printf("遍歷失敗\n");
}
Node_ptr q=L->next; //遍歷指針指向第一個節點
while(q)  //如果遍歷為空,結束遍歷
{printf("%-4d",q->data);//遍歷數據q=q->next;//指向下一個節點
}

鏈表任意位置插入

int link_insert_post(Node_ptr ,int ,datatype);

函數功能:先判斷位置是否合理,再在指定位置插入新節點

參數:鏈表頭結點地址、位置索引、待插入數據

返回值:成功返回0,失敗返回-1?

//創建節點
Node_ptr p=Node_apply(e);
if(p==NULL)
{printf("插入失敗2\n");return -1;
}
//調用函數找到post-1的地址,用q接收
Node_ptr q=link_find_post(L,post-1);
//利用頭插
p->next=q->next; //插入節點繼承post-1節點的指針指向
q->next=p;    //psost-1節點指向插入節點
//長度自增
L->len++;

鏈表頭刪

int link_delete_head(Node_ptr );

函數功能:判斷是否為空,刪除鏈表首節點非頭結點

參數:鏈表頭結點地址

返回值:成功返回0,失敗返回-1

//p記錄節點地址
Node_ptr p=L->next;
//刪除邏輯,頭節點指向下一個節點
L->next=p->next;
//釋放節點
free(p);
p=NULL;//防止野指針
//長度自減
L->len--;

任意位置刪除

int link_delete_post(Node_ptr ,int );

函數功能:先判斷位置是否合理刪除指定位置的節點

參數:鏈表頭結點地址、位置索引

返回值:成功返回0,失敗返回-1

//遍歷到post前驅節點,p接收post-1地址
Node_ptr p=link_find_post(L,post-1);
//刪除邏輯
//本質是p->next=(p->next)->next 
Node_ptr q=p->next; 
p->next=q->next;  //q被孤立
//釋放節點,置空
free(q);
q=NULL;
//長度自減
L->len--;

按值查找位置

int link_find_value(Node_ptr ,datatype );

函數功能:查找數據值首次出現的位置

參數:鏈表頭結點地址、待查找數據

返回值:成功返回位置索引(從1開始),失敗返回-1

//查找邏輯
Node_ptr p=L->next; //p指向第一個節點
for(int i=1;i<=L->len;i++) //遍歷查找
{	if(p->data==e)return i;p=p->next; //不匹配p往后移動
}
return -1;

按位置修改

int link_updata_post(Node_ptr ,int ,datatype);

函數功能:修改鏈表中指定位置節點的數據

參數:鏈表頭結點地址、位置索引、新數據

返回值:成功返回0,失敗返回-1

//查找邏輯,用p接收post地址
Node_ptr p=link_find_post(L,post);
//修改邏輯
p->data=e;

按值修改

int link_updata_value(Node_ptr,datatype,datatype);

函數功能:修改鏈表中的節點數據

參數:鏈表頭結點地址、舊數據、新數據

返回值:成功返回0,失敗返回-1

int link_updata_value(Node_ptr L,datatype old,datatype new)
{//查找邏輯int post=link_find_value(L,old);//判斷邏輯if(post==-1){return -1;}//修改邏輯link_updata_post(L,post,new);return 0;
}

單向鏈表反轉

int link_reverse(Node_ptr );

函數功能:反轉鏈表(頭結點除外)

參數:鏈表頭結點地址

返回值:成功返回0,失敗返回-1

Node_ptr H=L->next;   //H記錄第一個節點地址
L->next=NULL;      //清空頭節點
while(H!=NULL)   //遍歷
{Node_ptr q=H; //記錄H的指向,搬運作用H=H->next;//頭插形式插入q->next=L->next;L->next=q;
}

鏈表釋放

void link_free(Node_ptr);

函數功能:釋放鏈表所有節點(包括頭結點)

參數:鏈表頭結點地址

返回值:void

//釋放邏輯
while(!link_empty(L))
{//調用頭參函數link_delete_head(L);
}
//釋放頭節點,置空
free(L);
L=NULL;

完整代碼

linklist.h?

#ifndef LINKLIST_H
#define LINKLIST_H
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef int datatype;//定義數據域類型
typedef struct Node
{union{int len;  //頭結點數據域datatype data; //普通節點數據域};struct Node *next;   //節點指針域
}Node,*Node_ptr;
//創建單向鏈表
Node_ptr linklist_create();
//鏈表判空操作
int link_empty(Node_ptr );
//創建節點
Node_ptr Node_apply(datatype ); 
//單向鏈表頭插
int link_insert_head(Node_ptr ,datatype );
//單向鏈表按位置查找返回地址
Node_ptr link_find_post(Node_ptr ,int );
//鏈表的遍歷
void show(Node_ptr );
//鏈表任意位置插入
int link_insert_post(Node_ptr ,int ,datatype);
//鏈表頭刪
int link_delete_head(Node_ptr );
//任意位置刪除
int link_delete_post(Node_ptr ,int );
//按值查找返回位置
int link_find_value(Node_ptr ,datatype );
//按位置修改
int link_updata_post(Node_ptr ,int ,datatype);
//按值修改
int link_updata_value(Node_ptr,datatype,datatype);
//單向鏈表反轉
int link_reverse(Node_ptr );
//
//鏈表的釋放 
void link_free(Node_ptr);#endif

linklist.c

#include"linklist.h"
//此處頭結點的地址都用l表示
//其他節點用p/pa表示//創建單向鏈表
Node_ptr linklist_create()
{   //申請一個頭結點的空間Node_ptr l=(Node_ptr)malloc(sizeof(Node));if(l==NULL){printf("創建鏈表失敗\n");return NULL;		}//頭結點初始化l->len=0;//初始化長度為0l->next=NULL;//初始化指針為空,防止野指針printf("創建鏈表成功\n");return l;
}
//鏈表判空操作
//鏈表為空返回1,非空返回0
int link_empty(Node_ptr l)
{   //判斷鏈表傳入地址是否為空if(l==NULL){printf("鏈表不合法\n");return -1;}//通過判斷頭結點的后繼節點指針是否為空return l->next==NULL;
}
//創建節點
//成功返回節點地址,失敗返回空
Node_ptr Node_apply(datatype e)
{//堆區申請空間Node_ptr p=(Node_ptr)malloc(sizeof(Node));if(p==NULL){printf("節點空間申請失敗\n");return NULL;}printf("節點申請成功\n");p->data=e; //初始化數據域p->next=NULL; //初始化指針為空return p; //封裝好的節點地址
}
//單向鏈表頭插
//成功返回0失敗返回-1
//插入的數據是逆序,先進的在后面
int link_insert_head(Node_ptr L ,datatype e )
{//判斷邏輯if(L==NULL){printf("插入失敗\n");return -1;}//創建節點//pa指針接收節點的地址Node_ptr pa=Node_apply(e);if(pa==NULL){printf("插入失敗\n");return -1;}//頭插邏輯pa->next=L->next;//先繼承頭節點的指向L->next=pa;  //再將頭節點指針指向插入的節點//長度自增L->len++;printf("頭插成功\n");return 0;
}
//單向鏈表查找
//成功返回地址,失敗返回空
Node_ptr link_find_post(Node_ptr L,int post)
{//判斷邏輯if(L==NULL||post<0||post>L->len){printf("查找失敗\n");return NULL;}//查找邏輯Node_ptr q=L; //定義一個遍歷指針for(int i=0;i<post;i++) //先移動再自加,所有不需要等于post{q=q->next;//指向下一個節點}//返回節點return q;
}
//鏈表的遍歷
void show(Node_ptr L)
{//判斷邏輯if(link_empty(L)){printf("遍歷失敗\n");}Node_ptr q=L->next; //遍歷指針指向第一個節點while(q)  //如果遍歷為空,結束遍歷{printf("%-4d",q->data);//遍歷數據q=q->next;//指向下一個節點}putchar(10);
}
//鏈表任意位置插入
//成功插入返回0,失敗返回-1
int link_insert_post(Node_ptr L ,int post,datatype e)
{//判斷邏輯if(L==NULL||post<1||post>L->len+1) //判斷地址和插入邏輯的合理性{printf("插入失敗1\n");return -1;}//創建節點Node_ptr p=Node_apply(e);if(p==NULL){printf("插入失敗2\n");return -1;}//調用函數找到post-1的地址,用q接收Node_ptr q=link_find_post(L,post-1);//插入邏輯p->next=q->next; //插入節點繼承post-1節點的指針指向q->next=p;    //psost-1節點指向插入節點//長度自增L->len++;printf("插入數據成功\n");return 0;
}
//鏈表頭刪
//成功返回0,失敗返回-1
int link_delete_head(Node_ptr L)
{//判斷邏輯if(link_empty(L)){printf("刪除失敗\n");return -1;}//p記錄節點地址Node_ptr p=L->next;//刪除邏輯,頭節點指向下一個節點L->next=p->next;//釋放節點free(p);p=NULL;//防止野指針//長度自減L->len--;printf("鏈表頭刪成功\n");return 0;
}
//任意位置刪除
//成功返回0,失敗返回-1
int link_delete_post(Node_ptr L,int post)
{//判斷邏輯if(L==NULL||post<1||post>L->len){printf("按位置刪除失敗\n");return -1;}//遍歷到post前驅節點,p接收post-1地址Node_ptr p=link_find_post(L,post-1);//刪除邏輯//本質是p->next=(p->next)->next Node_ptr q=p->next; p->next=q->next;  //q被孤立//釋放節點,置空free(q);q=NULL;//長度自減L->len--;printf("刪除成功\n");return 0;
}
//按值查找返回位置
int link_find_value(Node_ptr L ,datatype e)
{//判斷邏輯if(L==NULL||link_empty(L)){printf("查找失敗\n");return -1;}//查找邏輯Node_ptr p=L->next; //p指向第一個節點for(int i=1;i<=L->len;i++) //遍歷查找{	if(p->data==e)return i;p=p->next; //不匹配p往后移動}printf("未找到,查詢失敗\n");return -1;
}
//按位置修改
int link_updata_post(Node_ptr L,int post,datatype e)
{//判斷邏輯if(L==NULL||link_empty(L)||post<0||post>L->len+1){printf("修改失敗\n");return -1;}//查找邏輯,用p接收post地址Node_ptr p=link_find_post(L,post);//修改邏輯p->data=e;return 0;
}
//按值修改
int link_updata_value(Node_ptr L,datatype old,datatype new)
{//查找邏輯int post=link_find_value(L,old);//判斷邏輯if(post==-1){return -1;}//修改邏輯link_updata_post(L,post,new);return 0;
}
//單向鏈表反轉
int link_reverse(Node_ptr L)
{if(L==NULL||L->len<=1){printf("翻轉失敗\n");return -1;}Node_ptr H=L->next;   //H記錄第一個節點地址L->next=NULL;      //清空頭節點while(H!=NULL)   //遍歷{Node_ptr q=H; //記錄H的指向,搬運作用H=H->next;//頭插形式插入q->next=L->next;L->next=q;}return 0;
}
//鏈表的釋放
void link_free(Node_ptr L)
{//判斷邏輯if (L=NULL){printf("釋放失敗\n");return;}//釋放邏輯while(!link_empty(L)){//調用頭參函數link_delete_head(L);}//釋放頭節點,置空free(L);L=NULL;printf("釋放成功\n");
}

main.c

#include"linklist.h"
int main(int argc, const char *argv[])
{	//定義指針x接收申請空間的首地址	Node_ptr x=linklist_create();	if(x==NULL){printf("創建失敗\n");}printf("創建鏈表成功\n");printf("%d\n",link_empty(x));//Node_apply(e);//頭插link_insert_head(x,1);link_insert_head(x,2);link_insert_head(x,3);link_insert_head(x,4);printf("%d\n",x->len);//鏈表查找//指針q接收地址Node_ptr q=link_find_post(x,2);printf("%d\n",q->data);printf("11111\n");show(x);link_insert_post(x,2,99);show(x);link_delete_head(x);show(x);link_delete_post(x,3);show(x);printf("%d\n",link_find_value(x,3));link_updata_post(x,3,88);show(x);link_updata_value(x,3,77);show(x);link_reverse(x);show(x);link_free(x);return 0;
}

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

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

相關文章

【第三節】Class與Style綁定

文章目錄Class與Style綁定綁定HTML Class對象語法數組語法綁定內聯樣式對象語法數組語法自動添加前綴Class與Style綁定 數據綁定一個常見需求是操作元素的 class 列表和它的內聯樣式,因為它們都是屬性&#xff0c;我們可以用 v-bind 處理它們:我們只需要計算出表達式最終的字符…

CMOS知識點 離子注入工藝

知識點8&#xff1a;離子注入是為了將摻雜劑&#xff08;如硼、磷等&#xff09;精確引入硅晶片的近表面區域&#xff0c;以改變其電學性質。工藝過程&#xff1a;電離與加速&#xff1a;摻雜劑原子在離子源中被電離&#xff08;帶電&#xff09;&#xff0c;通過高壓電場&…

從安裝到上手:Ubuntu 22.04 玩轉 Containerd 2.1.3 容器運行時

Containerd 是一款支持 OCI 規范的容器運行時&#xff0c;注重容器部署和生命周期管理的簡單性、健壯性與可移植性&#xff0c;常被嵌入到 Docker 和 Kubernetes 等系統中。本文將詳細介紹在 Ubuntu 22.04 服務器上通過二進制包手動安裝 Containerd 的完整步驟&#xff0c;包括…

Hadoop與云原生集成:彈性擴縮容與OSS存儲分離架構深度解析

Hadoop與云原生集成的必要性Hadoop在大數據領域的基石地位作為大數據處理領域的奠基性技術&#xff0c;Hadoop自2006年誕生以來已形成包含HDFS、YARN、MapReduce三大核心組件的完整生態體系。根據CSDN技術社區的分析報告&#xff0c;全球超過75%的《財富》500強企業仍在使用Had…

飛算科技:以創新科技引領數字化變革,旗下飛算 JavaAI 成開發利器

作為國家級高新技術企業&#xff0c;飛算科技專注于自主創新&#xff0c;在數字科技領域持續深耕&#xff0c;用前沿技術為各行業客戶賦能&#xff0c;助力其實現數字化轉型升級的飛躍。?飛算科技憑借深厚的技術積累&#xff0c;將互聯網科技、大數據、人工智能等技術與實際應…

多線程Python爬蟲:加速大規模學術文獻采集

1. 引言 在學術研究過程中&#xff0c;高效獲取大量文獻數據是許多科研工作者和數據分析師的需求。然而&#xff0c;傳統的單線程爬蟲在面對大規模數據采集時&#xff0c;往往效率低下&#xff0c;難以滿足快速獲取數據的要求。因此&#xff0c;利用多線程技術優化Python爬蟲&a…

NX717NX720美光固態閃存NX724NX728

美光NX系列固態閃存深度解析&#xff1a;技術、性能與市場洞察一、技術架構與核心創新美光NX系列固態閃存&#xff08;包括NX717、NX720、NX724、NX728&#xff09;的技術根基源于其先進的G9 NAND架構。該架構通過5納米制程工藝和多層3D堆疊技術&#xff0c;實現了存儲單元密度…

淺談——C++和C#差異

雖然這個話題看著似乎有些關公戰秦瓊的味道&#xff0c;但是作為游戲開發者&#xff0c;C和C#一定是繞不開的兩門語言。不過雖然說是比較二者差異&#xff0c;因為我學習的過程主要是先學C&#xff0c;所以我先基于C的認知&#xff0c;再來聊聊C#之中的不同。&#xff08;為什么…

rocky9-zabbix簡單部署

目錄 一、準備 1、&#xff08;rocky9&#xff09; 2、配置數據庫 二、配置文件 1、導入初始架構與數據 2、配置相關文件 三、啟動服務 1、瀏覽器訪問 2、解決亂碼問題 ?編輯 四、監控 ① 添加主機 1、修改配置文件 2、啟動服務 3、網頁添加 ②添加監控模塊 1…

tabBar設置底部菜單選項、iconfont圖標(圖片)庫、模擬京東app的底部導航欄

歡迎來到我的UniApp技術專欄&#xff01;&#x1f389; 在這里&#xff0c;我將與大家分享關于UniApp開發的實用技巧、最佳實踐和項目經驗。 專欄特色&#xff1a; &#x1f4f1; 跨平臺開發一站式解決方案 &#x1f680; 從入門到精通的完整學習路徑 &#x1f4a1; 實戰項目經…

7.22總結mstp,vrrp

一、MSTP技術&#xfeff;&#xfeff;MSTI和MSTI域根&#xfeff;&#xfeff;MSTP中的端口角色3. MSTP工作原理 MSTP 計算方法? CST/IST的計算和RSTP類似 ? MSTI的計算僅限于區域內 ? MSTI計算參數包含在IST BPDU中&#xff0c;和IST的計 算同步完成&#xfeff;&#xfe…

【電腦】網卡的基礎知識

網卡&#xff08;Network Interface Card, NIC&#xff09;是計算機中用于連接網絡的關鍵組件之一&#xff0c;它負責管理和發送數據包到互聯網或其他局域網設備。下面是一些關于網卡的詳細知識&#xff1a;網卡的基本結構MAC地址&#xff1a;每個網卡都有一個唯一的物理地址&a…

IPv4枯竭時代:從NAT技術到IPv6的演進之路

&#x1f50d; 開發者資源導航 &#x1f50d;&#x1f3f7;? 博客主頁&#xff1a; 個人主頁&#x1f4da; 專欄訂閱&#xff1a; JavaEE全棧專欄 IPv4&#xff08;Internet Protocol version 4&#xff09;是互聯網最核心的通信協議之一&#xff0c;自 1981 年正式標準化以來…

模式結構-微服務架構設計模式

需求&#xff08;Forces)結果上下文(Resulting context)相關模式(Related patterns)需求&#xff1a;必須解決的問題需求部分描述了必須解決的問題和圍繞這個問題的特定上下文環境。需求有時候是相互沖突的&#xff0c;所以不能指望把他們全部都解決&#xff08;必須取舍&#…

30個常用的Linux命令匯總和實戰場景示例

下面匯總常用的 30 個常用的 Linux 命令&#xff0c;每個都附有簡要說明和典型示例&#xff0c;適合日常開發、服務器維護或系統學習使用。30 個常用的 Linux 命令匯總 一、文件與目錄操作&#xff08;基礎&#xff09;命令說明示例ls列出文件和目錄ls -l 顯示詳細信息cd切換目…

Taro 網絡 API 詳解與實用案例

Taro 網絡 API 詳解與實用案例 在現代前端開發中&#xff0c;網絡通信是不可或缺的一環。Taro 作為一款多端開發框架&#xff0c;提供了豐富且統一的網絡 API&#xff0c;幫助開發者在小程序、H5、React Native 等多端環境下高效地進行數據交互。本文將詳細介紹 Taro 的四大網…

Bitbucket平臺的HTTP Access Tokens操作手冊

在Bitbucket平臺添加HTTP Access Tokens&#xff08;用于替代密碼進行認證&#xff09;。 1. 登錄Bitbucket并訪問個人設置 打開 Bitbucket 并登錄賬號。點擊右上角頭像 → 選擇 Manage account。 2. 生成Access Token 在左側菜單中選擇 Access tokens&#xff08;位于 Sec…

低成本、高泛化能力的無人機自主飛行!VLM-Nav:基于單目視覺與視覺語言模型的無地圖無人機導航

作者&#xff1a;Gobinda Chandra Sarker1^{1}1, AKM Azad2^{2}2, Sejuti Rahman1^{1}1, Md Mehedi Hasan1^{1}1單位&#xff1a;1^{1}1達卡大學&#xff0c;2^{2}2伊瑪目穆罕默德伊本沙特伊斯蘭大學論文標題&#xff1a;VLM-Nav: Mapless UAV-Navigation Using Monocular Visi…

Docker Desktop 安裝到D盤(包括wsl)

默認WSL虛擬機位置&#xff1a; C:\Users\<用戶名>\AppData\Local\Docker\wsl重裝DockerDesktop下載安裝包Docker Desktop Installer.exe在D盤創建文件夾D:\Program Files\DockerDesktopD:\Program Files\DockerDesktop\data 在cmd運行 start /w "" "Dock…

網絡協議(三)網絡層 IPv4、CIDR(使用子網掩碼進行網絡劃分)、NAT在私網劃分中的應用

利用子網掩碼進行子網劃分 這是一個模擬搭建的私網&#xff0c;有倆臺主機ab。現在主機a要給云端服務器發送一條消息&#xff0c;這條消息怎么才能到達云端服務器呢&#xff1f;確定這條數據中的源端為本地ip的9000端口&#xff0c;目的端為24.24.24.8888端口&#xff0c;首先&…