資料結構學習筆記 單鏈表

2021-10-09 09:35:51 字數 3967 閱讀 4556

準備知識在另一篇部落格:單鏈表預備知識

建立單鏈表:

頭插法:

每次都是從頭結點插入乙個元素的方法,所以它是倒序的。

struct lnode //建立結點結構體,由資料域和指標域組成

linknode;

void createlistf (linknode *

&l,elemtype a,

int n)

//從陣列a中讀取資料,並把結點插入鍊錶。

}尾插法:每次插入是在當時的尾結點,所以結點的順序是正常的。為了能夠在末尾插入,我們應該需要乙個指標r始終指向鍊錶的結尾(即每次插入乙個新結點後都要把r指向這個新結點),以方便插入資料,最後還要把r指向的尾結點的指標域設定為null。

//讀取元素值,插入結點。

r -> next =

null

;}單鏈表中的線性表基本運算:

初始化單鏈表:

void

initlist

(linknode *

&l)//建立頭結點,即為初始化單鏈表

銷毀單鏈表:所謂銷毀單鏈表其實就是釋放每個結點的空間,這裡需要兩個指標pre和p,分別指向頭結點和首結點,迴圈操作就是:釋放pre所指向的結點,pre跑到p這裡來,p跑到下乙個結點。演算法會用到while迴圈,迴圈的條件是p != null,理解方法如下:釋放了倒數第二個結點後,pre跑到最後乙個結點這裡,p跑到null那裡去了,這時候pre在最後乙個結點,還沒有釋放,所以迴圈結束後單獨寫乙個語句釋放最後乙個結點。

;

判斷線性表是否為空表:判斷是否為空表其實只需要判斷頭結點的指標域是否為空即可,為null就說明頭結點後面沒有結點,也就是沒有元素了。

bool

listempty

(linknode *l)

//判斷是否為空表

求線性表的長度:這裡的長度是指元素個數,並沒有包括頭結點。由於單鏈表中沒有順序表中的length域,所以只能夠通過遍歷+記數的方式來得到長度。

int

lengthlist

(linknode *l)

return n;

//return length;

}//計算單鏈表的長度

//千萬注意!!如果對鍊錶插入或修改了元素,那麼length將不會是鍊錶的長度,

//除非在修改的時候也對array[length]做修改

其實單鏈表的長度就是data域的個數,也就是array的元素個數,所以這個函式可以直接返回length。輸出線性表:輸出方法就是遍歷每乙個結點,然後輸出資料域,當指標為null並輸出之後,結束迴圈。

void

displaylist

(linknode *l)

//對於每乙個結點,都會進行判斷,輸出,移動,那麼最後乙個結點也會判斷,輸出,移動,

//移動後,需要結束迴圈,這時p為null,那麼條件可以為 p != null

求線性表中某個資料元素的值:

bool

getelem

(linknode *l,

int i, elemtype &e)

//當j還沒到i那裡並且p所指向的元素不是最後乙個結點的指標域所指向的空間(null)時,

//迴圈繼續。

if(p ==

null

)return

false

;else

//到了最後,i錯誤,返回false或者是到了i那裡,輸出這個結點的data域。

}

插入資料元素:注意,這裡的插入數碼元素是指在已經占用的邏輯序號上插入,在最後乙個元素的後乙個位置插入是不可以的,插入到最後的後乙個位置可以用尾插法。

bool

listinsert

(linknode *

&l,int i, elemtype e)

//找第i-1個結點,i沒問題則j = i-1,p指向i-1個結點,否則p = null,j沒有意義

if(j == i -1)

if(p ==

null

)return

false

;}

在任意位置插入都能夠給出滿意的答覆的插入演算法:

bool

insertelement

(linknode *

&l,int i, elemtype e)

else

if(i ==0)

//在首結點前面的第乙個位置插入,頭插法。

elseif(

0< i <= length)

//插入位置是某個元素的位置

s -> next = p -

> next;

p -> next = s;

printf

("在第%d個位置插入成功!此時a%d = %d\n"

, i,i,s -

> data)

;return

true;}

else

if(i == length +1)

p -> next = s;

printf

("在最後面插入新元素成功,此時a%d = %d\n"

, i,s -

> data)

;return

true;}

else

}

刪除資料元素:做法就是:若i合法,則找到第i-1個結點,然後進行刪除操作。

bool

listdelete

(linknode *

&l,int i, elemtype &e)

else

if(i >

lengthlist

(l))

//排除掉i的非法性

else

//使p指向第i-1個結點。

linknode *agent = p -

> next;

//標記被刪除元素。

e = agent -

> data;

p -> next = agent -

> next;

free

(agent)

;return

true;}

}

資料結構學習筆記 單鏈表

陣列優勢在於快速定位元素,對於讀操作多,寫操作少的場景,陣列更合適 鍊錶優勢在於快速的插入和刪除操作,如果頻繁的在尾部刪除和插入元素,用鍊錶更好 package com.cc.node public class nodedemo1 private node head private node las...

資料結構學習筆記3 單鏈表

1.相對於順序表的線性儲存,順序表的鏈式儲存 單鏈表為例 最突出的優點 對元素的插入與刪除非常快 順序表的線性儲存插入和刪除需要移動大量的元素,操作速度緩慢 而獲取元素的速度相對而言比較快 單鏈表剛好和他相反,插入和刪除很快,獲取元素速度比不上線性表 2.單鏈表的形式 3.單鏈表的插入和刪除 4.除...

資料結構學習筆記1 單鏈表

單鏈表作為一種簡單的線性資料結構,是一種較為基礎的資料結構,我利用c 實現了它的一部分基本功能。這些演算法都是較為基本的,只需要注意其邏輯即可,值得一提的是,l作為頭節點,在每次操作的時候都要將其賦值給別的指標,以免產生混亂。includeusing namespace std struct lno...