单链表入门(一)
小徒弟Karl非常想學(xué)鏈表,所以我打算寫一篇關(guān)于單鏈表的入門教程。既然是入門,那就要打好基礎(chǔ),從頭說起。所以先說“線性表”。
一、什么是線性表
線性表是具有相同特性的數(shù)據(jù)元素的一個(gè)有限序列。
該序列中所含元素的個(gè)數(shù)叫做線性表的長度,如果n表示,那么n>=0。
當(dāng)n=0時(shí),表示線性表是一個(gè)空表,即表中不包含任何元素。
設(shè)序列中第i(i表示位序)個(gè)元素為ai(1≤i≤n)。
線性表的一般表示為:(a1,a2,…ai,ai+1,…,an)
其中a1為第一個(gè)元素,又稱做表頭元素,a2為第二個(gè)元素,an為最后一個(gè)元素,又稱做表尾元素。
例如,在線性表(1,4,3,2,8,10)中,1為表頭元素,10為表尾元素。
線性表的特點(diǎn):
1、 有序
線性表里面的元素是一個(gè)挨著一個(gè)順序排下去的,就像大家排隊(duì)買票;
2、允許沒有元素,也就是空表;
3、第一個(gè)元素有且僅有一個(gè)后繼,最后一個(gè)元素有且僅有一個(gè)前驅(qū),其他元素有且僅有一個(gè)前驅(qū)以及有且僅有一個(gè)后繼。
二、線性表的運(yùn)算
線性表有一些基本運(yùn)算,舉例如下:
(1) 初始化線性表——構(gòu)造一個(gè)空的線性表;(2) 銷毀線性表——釋放線性表占用的內(nèi)存空間;(3) 判線性表是否為空表;(4) 求線性表的長度——返回表中元素個(gè)數(shù);(5) 遍歷線性表——當(dāng)線性表不為空時(shí),順序顯示表中各結(jié)點(diǎn)的值域;(6) 求線性表中指定位置的某個(gè)數(shù)據(jù)元素;(7) 定位查找LocateElem(L,e):返回表L中第1個(gè)值域與e相等的位序。若這樣的元素不存在,則返回值為0。(8) 插入數(shù)據(jù)元素——在L的第i個(gè)元素之前插入新的元素e,L的長度增加1。(9) 刪除數(shù)據(jù)元素——?jiǎng)h除L的第i個(gè)元素,L的長度減1。三、線性表的順序存儲(chǔ)——順序表
線性表只是一種邏輯結(jié)構(gòu),至于它在計(jì)算機(jī)中是如何存儲(chǔ)的,我們還要專門討論。因?yàn)榫€性表是有順序的,所以很容易想到用數(shù)組來存儲(chǔ)線性表。
線性表的順序存儲(chǔ)結(jié)構(gòu)就是:把線性表中的所有元素按照其邏輯順序依次存儲(chǔ)到一塊連續(xù)的存儲(chǔ)空間中。
用數(shù)組來存儲(chǔ)線性表,其缺點(diǎn)是:
1、在插入、刪除時(shí)要移動(dòng)大量的結(jié)點(diǎn)
2、表的大小在定義數(shù)組時(shí)指定,無法動(dòng)態(tài)更改
為了克服以上缺點(diǎn),有了線性表的鏈?zhǔn)酱鎯?chǔ)。
四、線性表的鏈?zhǔn)酱鎯?chǔ)—鏈表
在鏈?zhǔn)酱鎯?chǔ)中,每個(gè)存儲(chǔ)結(jié)點(diǎn)不僅包含元素本身的信息(稱之為數(shù)據(jù)域),而且包含元素之間邏輯關(guān)系的信息,即包含其后繼結(jié)點(diǎn)的地址信息,這稱為指針域。一般地,每個(gè)結(jié)點(diǎn)有一個(gè)或多個(gè)這樣的指針域。若一個(gè)結(jié)點(diǎn)中的某個(gè)指針域不需要指向任何結(jié)點(diǎn),則僅它的值為空,用NULL表示。
五、單鏈表
在每個(gè)結(jié)點(diǎn)中除包含有數(shù)據(jù)域外,又設(shè)置一個(gè)指針域,用以指向其后繼結(jié)點(diǎn),這樣的表稱為線性單向鏈接表,簡稱單鏈表。
1、不帶頭結(jié)點(diǎn)的單鏈表
這種單鏈表必須有一個(gè)頭指針(假設(shè)叫head),用以指向單鏈表中第一個(gè)結(jié)點(diǎn)。否則單鏈表會(huì)在內(nèi)存中丟失。
示意圖如下:
2、帶頭結(jié)點(diǎn)的單鏈表
為了便于插入和刪除等算法的實(shí)現(xiàn),在單鏈表的第一個(gè)元素之前增加一個(gè)特殊的節(jié)點(diǎn)——稱為頭節(jié)點(diǎn),頭結(jié)點(diǎn)的數(shù)據(jù)域一般不使用,只使用其指針域。這種單鏈表在應(yīng)用時(shí),必須要知道頭結(jié)點(diǎn)的地址,否則單鏈表會(huì)在內(nèi)存中丟失。
示意圖如下:
3、循環(huán)單鏈表
鏈表中最后一個(gè)結(jié)點(diǎn)的指針域不再是NULL,而是指向整個(gè)鏈表的第一個(gè)結(jié)點(diǎn)或者頭結(jié)點(diǎn),從而使鏈表形成一個(gè)環(huán)。和單鏈表相同,循環(huán)單鏈表也有帶頭結(jié)點(diǎn)和不帶頭結(jié)點(diǎn)兩種。
下圖是帶頭結(jié)點(diǎn)的循環(huán)單鏈表:
總結(jié)
- 上一篇: 三角形面积=SQRT(S*(S-a)*(
- 下一篇: 产品经理如何应对一句话需求