上學期臨近期末的時候用word寫了一篇鍊錶詳解,今天突然想到自己一直在搞演算法題,很長時間沒有用鍊錶了。試著在紙上寫了幾步,發現回想起來竟然有些吃力,這裡把上學期寫的鍊錶詳解貼上來mark一下,順便以此作為資料結構筆記的第一篇。
首先,想要熟練使用鍊錶,就要知道兩大類基本知識點:
1. 指標 2.結構體結構體定義部分:
struct node;
帶頭節點的煉表示意圖:
上圖就是鏈結後每個節點的狀態,單鏈表每個節點儲存下乙個節點的位址(struct node *next),環環相扣,因此稱之為鍊錶。知道這兩個知識點後,我們就可以開始寫鍊錶了。首先是定義結構體,struct node;千萬不要忘了結構體定義後的分號!
typedef是用來為複雜的宣告定義簡單的別名,比如typedef struct node}lnode;
這句話的意思即使用lnode來代替struct node這句宣告。
typedef的好處是什麼呢?
我認為有如下:
首先,在複雜的程式裡,很容易打錯一些字,比如把struct打成stuct,把struct node 打成struct ndoe blablabla~,用typedef可以避免這種錯誤發生。
其次,簡單省事,struct node *head; 和 lnode *head;都是定義頭節點的作用,但顯然後者更加便捷。(當然不怕麻煩並且足夠自信的話用第乙個也完全沒問題)
如果想得到建立後的鍊錶,我們顯然需要知道他的頭在哪。因此在createlink()函式中,需要返回head(也就是這條鍊子的頭部),這樣順著頭我們就可以一直找到鍊錶的每乙個元素,直到尾部(p若為最後乙個鏈結的話,那麼p->next==null)。
因為需要返回head這個指標,因此需要這樣寫(可能有小夥伴會有疑問:都說通過傳遞指標給函式就可以改變實參的值,還有必要返回指標嗎?有興趣的讀者可以跳轉到我的這篇部落格:關於傳遞指標與傳遞引用作引數的測試)
struct node *
createlink()
返回值型別搞定之後,我們便可以進入建立鍊錶的環節。
單鏈表分為兩種:
(1)不帶頭節點的鍊錶:此種鍊錶的head即儲存第乙個資料,訪問時從head開始。不利於刪除或者新增指定位置資料的操作。
(2)帶頭節點的鍊錶:此種鍊錶儲存資料是從head->next開始的,head中並未儲存有資料,訪問時自然head->next開始,優點就是方便操作。
這裡先以不帶頭節點的鍊錶的建立為例
(我採用建立鍊錶的方法叫做尾插法——每新建立乙個節點,都把它放到現有鍊錶的尾部)
首先,我們需要有乙個結構體指標來儲存頭節點,方便於之後的使用,所以:struct node *head;
注意:這裡的head是不能變的,,不變的意思不是他的值不變,而是他永遠固定在鍊錶的首位,作為鍊錶的頭部,方便之後的索引。
因此,當我們每新加入乙個元素時,不是直接更新head的值,而是在鍊錶的尾部插入乙個新的結點。不妨用乙個結構體指標pnew來記錄新加入的值,通過舊節點pend與新節點的相連來構造乙個鍊錶,示意圖如下:
顯然,pend所指向的單位,實際就是上一次的pnew(可以理解為,pnew作為新元素被成功加入到鍊錶之後,它便變成了舊節點,兩個字概括為:更替)
欸?是不是還有乙個變數忘了宣告?沒錯,那就是整型n,用來表示新加入的值。這樣我們便可以通過輸入n並且給節點賦值,只要輸入不為-1,那麼繼續進行輸入,否則終止迴圈。
不帶頭節點單鏈表**的實現:
首先,我們定義head,最初的時候鍊錶還沒有新增元素,因此head=null;
然後,輸入乙個元素代表將要新增的值。判斷元素是否符合條件(這裡以元素》=0為條件),如果滿足,就進入新增環節。
scanf
("%d"
,&num)
;while
(num>=0)
在迴圈中,因為要新增值,所以要先為pnew分配記憶體,這樣才能對pnew進行賦值操作。
pnew=
(struct node*
)malloc
(sizeof
(struct node));
pnew->num=num;
pnew->next=
null
;//新建立的指標的下乙個位置還沒有定
因為我們想要建立不帶頭節點的單鏈表,因此如果是第一次新增值(第一次新增的判斷是,如果head指向null,證明還未加入元素),那麼head就應該指向pnew的位置,然後pnew(也就是head)的位置變為舊位置pend。
if
(head==
null
)
else
這樣,便成功建立了不帶頭節點的單鏈表。
完整**
scanf
("%d"
,&num)
;while
(num>=0)
else
scanf
("%d"
,&num)
;}
帶頭節點單鏈表**的實現:帶有頭節點的單鏈表創立,只需稍微改變**即可。
既然是帶有頭節點,那麼頭節點裡肯定是不需要賦值的,因此在建立時,我們直接最開始就讓頭節點作為舊節點,這樣頭節點就可以不用被賦值了。
head=
(struct node*
)malloc
(sizeof
(struct node));
head->next=
null
;pend=head;
scanf
("%d"
,&n)
;while
(n!=-1
)
單鏈表的建立 從零開始遞引用作引數的測試
結構體定義部分 struct node 帶頭節點的煉表示意圖 上圖就是鏈結後每個節點的狀態,單鏈表每個節點儲存下乙個節點的位址 struct node next 環環相扣,因此稱之為鍊錶。知道這兩個知識點後,我們就可以開始寫鍊錶了。首先是定義結構體,struct node 千萬不要忘了結構體定義後的...
從零開始學習NumPy建立陣列
引入numpy,並且取名字為np import numpy as np用 np.array 從 python 列表建立陣列 import numpy as np a np.array 1 4,2 5,3 print a陣列為 a 輸出為 a陣列為 14 253 不同於python列表,numpy要求...
從零開始建立VUE專案
1 首先配置npm的全域性模組的存放路徑 cache的路徑,此處選擇放在 d program files nodejs 輸入如下命令 npm config set prefix e nodejs node global npm config set cache e nodejs node cache...