主頁 >  其他 > 一文弄懂回圈鏈表、雙向鏈表、靜態鏈表

一文弄懂回圈鏈表、雙向鏈表、靜態鏈表

2021-01-14 12:01:49 其他

回圈鏈表、雙向鏈表、靜態鏈表

三遍定律:
理解了單鏈表本文的理解易如反掌,單鏈表請點擊這里
理解了單鏈表本文的理解易如反掌,單鏈表請點擊這里
理解了單鏈表本文的理解易如反掌,單鏈表請點擊這里

1.回圈鏈表

將單鏈表中終端結點的指標端由空指標改為指向頭結點,就使整個單鏈表形成一個環,這種頭尾相接的單鏈表稱為單回圈鏈表,簡稱回圈鏈表(circular linked list),

回圈鏈表可以從任意一個結點出發,訪問到鏈表的全部結點,

為了使空鏈表與非空鏈表處理一致,我們通常設一個頭結點,當然,這并不是說,回圈鏈表一定要頭結點,這需要注意,回圈鏈表帶有頭結點的空鏈表如圖:

在這里插入圖片描述

對于非空的回圈鏈表就如圖:

在這里插入圖片描述

回圈鏈表和單鏈表的主要差異就在于回圈的判斷條件上,原來是判斷 p->next 是否為空,現在則是
p->next 不等于頭結點,則回圈未結束,

在單鏈表中,我們有了頭結點時,我們可以用O(1)的時間訪問第一個結點,但對于要訪問到最后一個結點,卻需要O(n)時間,因為我們需要將單鏈表全部掃描一遍,

有沒有可能用O(1)的時間由鏈表指標訪問到最后一個結點呢?當然可以,

不過我們需要改造一下這個回圈鏈表,不用頭指標,而是用指向終端結點的尾指標來表示回圈鏈表,此時查找開始結點和終端結點都很方便了,如圖:

在這里插入圖片描述
從上圖中可以看到,終端結點用尾指標 rear 指示,則查找終端結點是 O(1),而開始結點,其實就是rear->next->next,其時間復雜也為 O(1),

舉個程式的例子,要將兩個回圈鏈表合并成一個表時,有了尾指標就非常簡單了,比如下面的這兩個回圈鏈表,它們的尾指標分別是rearA和rearB,如圖:

在這里插入圖片描述
要想把它們合并,只需要如下的操作即可,如圖:

在這里插入圖片描述
光說不寫假把式,代碼如下:

/* 保存 A 表的頭結點,即 ① */
p = rearA->next;
/* 將本是指向 B 表的第一個結點(不是頭結點)賦值給 RearA->next,即 ② */
rearA->next = rearB->next->next;
q = rearB->next;
/* 將原 A 表的頭結點賦值給 rearB->next,即 ③ */
rearB->next = p;
/* 釋放 q */
free(q);

2.雙向鏈表

我們的單鏈表,總是從頭到尾找結點,難道就不可以正反遍歷都可以嗎?當然可以,只不過需要加點東西而已,

我們在單鏈表中,有了next指標,這就使得我們要查找下一結點的時間復雜度為O(1),可是如果我們要查找的是上一結點的話,那最壞的時間復雜度就是O(n)了,因為我們每次都要從頭開始遍歷查找,

為了克服單向性這一缺點,我們的老科學家們,設計出了雙向鏈表,雙向鏈表(double linkedlist)是在單鏈表的每個結點中,再設定一個指向其前驅結點的指標域,所以在雙向鏈表中的結點都有兩個指標域,一個指向直接后繼,另一個指向直接前驅,

/* 線性表的雙向鏈表存盤結構 */
typedef struct DulNode{    
	ElemType data;    
	struct DuLNode *prior;    /* 直接前驅指標 */    
	struct DuLNode *next;     /* 直接后繼指標 */
} DulNode, *DuLinkList;

既然單鏈表也可以有回圈鏈表,那么雙向鏈表當然也可以是回圈表,雙向鏈表的回圈帶頭結點的空鏈表如圖:

在這里插入圖片描述
非空的回圈的帶頭結點的雙向鏈表如圖:

在這里插入圖片描述
由于這是雙向鏈表,那么對于鏈表中的某一個結點p,它的 后繼的前驅 和 它的 前驅的后繼 自然也是它自己,即:

p->next->prior = p = p->prior->next

雙向鏈表是單鏈表中擴展出來的結構,所以它的很多操作是和單鏈表相同的,比如求長度的ListLength,查找元素的 GetElem,獲得元素位置的 LocateElem 等,這些操作都只要涉及一個方向的指標即可,另一指標多了也不能提供什么幫助,

就像人生一樣,想享樂就得先努力,欲識訓就得付代價,雙向鏈表既然是比單鏈表多了如可以反向遍歷查找等資料結構,那么也就需要付出一些小的代價:在插入和洗掉時,需要更改兩個指標變數,

插入操作時,其實并不復雜,不過順序很重要,千萬不能寫反了,

我們現在假設存盤元素e的結點為s,要實作將結點s插入到結點p和p->next之間需要下面幾步,如圖:

在這里插入圖片描述
步驟如下:

/* 把 p 賦值給 s 的前驅,如圖中 ① */
s->prior = p;
/* 把p->next賦值給s的后繼,如圖中 ② */
s->next = p->next; 
/* 把s賦值給p->next的前驅,如圖中③ */
p->next->prior = s; 
/* 把s賦值給p的后繼,如圖中④ */
p->next = s;

關鍵在于它們的順序,由于第2步和第3步都用到了p->next,如果第4步先執行,則會使得p->next提前變成了s,使得插入的作業完不成,所以我們不妨把上面這張圖在理解的基礎上記憶,順序是先搞定s的前驅和后繼,再搞定后結點的前驅,最后解決前結點的后繼,

如果插入操作理解了,那么洗掉操作,就比較簡單了,

若要洗掉結點p,只需要下面兩步驟,如圖:

在這里插入圖片描述
步驟如下:

/* 把p->next賦值給p->prior的后繼,如圖中① */
p->prior->next = p->next;
/* 把p->prior賦值給p->next的前驅,如圖中② */
p->next->prior = p->prior;
/* 釋放結點 */
free(p); 

雙向鏈表相對于單鏈表來說,要更復雜一些,畢竟它多了prior指標,對于插入和洗掉時,需要格外小心,另外它由于每個結點都需要記錄兩份指標,所以在空間上是要占用略多一些的,不過,由于它良好的對稱性,使得對某個結點的前后結點的操作,帶來了方便,可以有效提高演算法的時間性能,說白了,就是用空間來換時間,

3.靜態鏈表

C語言具有指標這一強大的功能,也是眾多計算機領域的人用來描述資料結構首選C語言的原因之一,指標可以使C非常容易的操作記憶體中的地址和資料,這比其他高級語言更加靈活方便,Java、C#等面向物件語言,雖然不使用指標,但因為啟用了物件參考機制,從某種角度也間接實作了指標的某些作用,但對于其他一些語言,如Basic、Fortran等早期的編程語言對于一些資料結構的操作就沒有那么方便了,

有前輩想出來用陣列來代替指標,描述單鏈表:首先讓陣列的元素都是由兩個資料域組成,data和cur,也就是說,陣列的每個下標都對應一個data和一個cur,資料域data,用來存放資料元素,也就是通常我們要處理的資料;而cur相當于單鏈表中的next指標,存放該元素的后繼在陣列中的下標,我們把cur叫做游標,

我們把這種用陣列描述的鏈表叫做靜態鏈表,這種描述方法還有起名叫做游標實作法,

為了我們方便插入資料,通常會把陣列建立得大一些,以便有一些空閑空間可以便于插入時不至于溢位,

用代碼描述一下:

/* 線性表的靜態鏈表存盤結構 */
/* 假設鏈表的最大長度是1000 */
#define MAXSIZE 1000
typedef struct
{    
	ElemType data;    
	/* 游標(Cursor),為0時表示無指向 */    
	int cur;                             
} Component,   
StaticLinkList[MAXSIZE]; 

對陣列第一個和最后一個元素作為特殊元素處理,不存資料,我們通常把未被使用的陣列元素稱為備用鏈表,而陣列第一個元素,即下標為0的元素的cur就存放備用鏈表的第一個結點的下標;而陣列的最后一個元素的cur則存放第一個有數值的元素的下標,相當于單鏈表中的頭結點作用,當整個鏈表為空時,則為0,如圖:

在這里插入圖片描述
假設我們已經將資料存入靜態鏈表,比如分別存放著“甲”、“乙”、“丁”、“戊”、“己”、“庚”等資料,則它的狀態如圖所示:

在這里插入圖片描述
此時“甲”這里就存有下一元素“乙”的游標2,“乙”則存有下一元素“丁”的下標3,而“庚”是最后一個有值元素,所以它的cur設定為0,而最后一個元素的cur則因“甲”是第一有值元素而存有它的下標為1,而第一個元素則因空閑空間的第一個元素下標為7,所以它的cur存有7,

(1)靜態鏈表的插入操作

靜態鏈表中解決的是:如何用靜態模擬動態鏈表結構的存盤空間的分配,需要時申請,無用時釋放,

在動態鏈表中,結點的申請和釋放分別借用 malloc() 和 free() 兩個函式實作,在靜態鏈表中,操作的是陣列,不存在像動態鏈表的結點申請和釋放問題,所以我們需要自己實作這兩個函式,才可以做插入和洗掉操作,

為了辨明陣列中哪些分量未被使用,解決辦法是將所有未被使用過的及被洗掉的分量用游標鏈成一個備用的鏈表,每當進行插入時,便可以從備用鏈表上取的第一個結點作為待插入的新結點,

/* 若備用空間鏈表非空,則回傳分配的結點下標,否則回傳 0 */
int Malloc_SLL(StaticLinkList space)
{
	/* 當前陣列第一個元素的 cur 存的值,就是要回傳的第一個備用的空閑的下標 */
	int i = space[0].cur;
	/* 由于要拿出一個分量來使用了,所以我們就得把它的下一個分量用來做備用 */
	if (space[0].cur)
		space[0].cur = space[i].cur;
	return i;
}

這段代碼,一方面它的作用就是回傳一個下標值,這個值就是陣列頭元素的cur存的第一個空閑的下標,從上面的圖示例子來看,其實就是回傳7,

那么既然下標為7的分量準備要使用了,就得有接替者,所以就把分量7的cur值賦值給頭元素,也就是把8給space[0].cur,之后就可以繼續分配新的空閑分量,實作類似malloc()函式的作用,

現在我們如果需要在“乙”和“丁”之間,插入一個值為“丙”的元素,按照以前順序存盤結構的做法,應該要把“丁”、“戊”、“己”、“庚”這些元素都往后移一位,但目前不需要,因為我們有了新的手段,

新元素“丙”,想插隊是吧?可以,你先悄悄地在隊伍最后一排第7個游標位置待著,我一會就能幫你搞定,我接著找到了“乙”,告訴他,你的cur不是游標為3的“丁”了,這點小錢,意思意思,你把你的下一位的游標改為7就可以了,“乙”嘆了口氣,收了錢把cur值改了,此時再回到“丙”那里,說你把你的cur改為3,就這樣,在絕大多數人都不知道的情況下,整個排隊的次序發生了改變,如圖:

在這里插入圖片描述
上圖實作代碼如下:

/* 在 L 中第 i 個元素之前插入新的資料元素 e */
Status ListInsert(StaticLinkList L, int i, ElemType e)
{
	int j, k, l;
	/* 注意 k 首先是最后一個元素的下標 */
	k = MAX_SIZE - 1if (i < 1 || i > ListLength(L) + 1)
		return ERROR;
	/* 獲得空閑分量的下標 */
	j = Malloc_SLL(L);
	if (j)
	{
		/* 將資料賦值給此分量的data */         
		L[j].data = e;                           
		/* 找到第i個元素之前的位置 */         
		for (l = 1; l <= i - 1; l++)                 
			k = L[k].cur;         
		/* 把第i個元素之前的cur賦值給新元素的cur */         
		L[j].cur = L[k].cur;                 
		/* 把新元素的下標賦值給第i個元素之前元素的cur */         
		L[k].cur = j;       
		return OK;
	}
	return ERROR;
} 

當我們執行插入陳述句時,我們的目的是要在“乙”和“丁”之間插入“丙”,呼叫代碼時,輸入 i 值為 3,
讓 k = MAX_SIZE-1=999,
j = Malloc_SSL(L) = 7,此時下標為 0 的 cur 也因為 7 要被占用而更改備用鏈表的值為 8,
for 回圈 l 由 1 到 2,執行兩次,代碼 k = L[k].cur ; 使得 k = 999,得到 k = L[999].cur = 1,再得到 k = L[1].cur = 2,
L[j].cur = L[k].cur ; 因 j = 7,而 k = 2 得到L[7].cur=L[2].cur = 3,這就是剛才我說的讓“丙”把它的cur 改為 3的意思,
L[k].cur = j;意思就是L[2].cur = 7,也就是讓“乙”得點好處,把它的 cur 改為指向“丙”的下標 7,
就這樣,我們實作了在陣列中,實作不移動元素,插入了資料的操作,

(2)靜態鏈表的洗掉操作

洗掉元素時,原來是需要釋放結點的函式 free(),現在我們要自己實作它:

/* 洗掉在 L 中第 i 個元素 e */
Status ListDelete(StaticLinkList L, int i)
{
	int j, k;
	if (i < 1 || i > ListLength(L))
		return ERROR;
	k = MAX_SIZE - 1;
	for (j = 1; j <= i; j++)
		k = L[k].cur;
	j = L[k].cur;
	L[k].cur = L[i].cur;
	Free_SSL(L,j);  /* 看下文 */
	return OK;
}

將下標為k的空閑結點回收到備用鏈表代碼:

/* 將下標為k的空閑結點回收到備用鏈表 */
void Free_SSL(StaticLinkList space, int k)
{
	/* 把第一個元素 cur 值賦給要洗掉的分量 cur */
	space[k].cur = space[0].cur;
	/* 把要洗掉的分量下標賦值給第一個元素的 cur */
	space[0].cur = k;
}

甲現在要走,這個位置就空出來了,也就是,未來如果有新人來,最優先考慮這里,所以原來的第一個空位分量,即下標是 8 的分量,它降級了,把 8 給“甲”所在下標為 1 的分量的 cur,也就是 space[1].cur = space[0].cur = 8,而 space[0].cur = k = 1 其實就是讓這個洗掉的位置成為第一個優先空位,把它存入第一個元素的 cur 中,如圖:

在這里插入圖片描述
(3)靜態鏈表的優缺點

上圖:

在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/248556.html

標籤:其他

上一篇:做好一個普通人 逐步地悟出自己的規劃 才是可以走的路

下一篇:你不輸出,怎么進步呢。

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more