單鏈表的頭插法與尾插法詳解

2021-10-24 22:26:00 字數 2845 閱讀 3663

建立單鏈表

關於資料結構的入門,就是從順序表和單鏈表開始。

我們不講順序表,直接從單鏈表開始我們的資料結構和演算法的學習之路。

單鏈表就是一種特殊的結構體組合而成的資料結構,關於單鏈表的建立方法有很多種,但都大同小異。

正如這幅圖中所表示的那樣,單鏈表就是由可能不連續的資料所組合而成的資料結構。 其中每個資料分為兩部分,一部分是資料儲存的位置,稱為資料域,另外指標所儲存的地方,稱為指標域。

typedef

struct node lnode,

*linklist;

在進入建立鍊錶之前,我們先寫好主函式的用來輸出的輸出函式。

void

illustrate

(linklist head)

}int

main()

頭插法建立單鏈表

頭插法**:

linklist creat_list

(linklist head)

return head;

}

頭插法建立鍊錶的根本在於深刻理解最後兩條語句

node->next = head->next;

head->next = node;

建立第乙個結點

執行第一次迴圈時,第一次從堆中開闢一塊記憶體空間給node,此時需要做的是將第乙個結點與 head 連線起來。而我們前面已經說過,單鏈表的最後乙個結點指向的是 null。

因此插入第乙個結點時,我們需要將頭指標指向的 next 賦給新建立的結點的 next , 這樣第乙個插入的結點的 next 指向的就是 null。 接著,我們將資料域,也就是 node 的位址賦給 head->next, 這時 head->next 指向的就是新建立的 node的位址。而 node 指向的就是 null。

接著我們建立第二個結點

因為使用的頭插法,因此新開闢的記憶體空間需要插入 頭指標所指向的下乙個位址,也就是新開闢的 node 需要插入 上乙個 node 和 head 之間。 第乙個結點建立之後,head->next 的位址是 第乙個 node 的位址。 而我們申請到新的一塊儲存區域後,需要將 node->next 指向 上乙個結點的首位址, 而新node 的位址則賦給 head->next。 因此也就是 node->next = head->next 。

這樣便將第乙個結點的位址賦給了新建立位址的 next 所指向的位址。後兩個結點就連線起來。

接下來再將頭結點的 next 所指向的位址賦為 新建立 node 的位址。 head->next = node ,這樣就將頭結點與新建立的結點連線了起來。 此時最後乙個結點,也就是第一次建立的結點的資料域為0,指標域為 null。

建立更多的結點也就不難理解。

執行一次:

會發現,頭插法建立鍊錶時候,就相當於後來居上。 後面的結點不斷往前插,而最後建立的結點在第乙個結點處, 第乙個建立的結點變成了尾結點。

尾插法建立單鏈表

尾插法**:

linklist creat_list

(linklist head)

end->next =

null

;}

尾插法深刻理解:

end->next = node;                      		

end = node;

尾插法建立第乙個結點

剛開始為頭結點開闢記憶體空間,因為此時除過頭結點沒有新的結點的建立,接著將頭結點的指標域 head->next 的位址賦為 null。因此此時,整個鍊錶只有乙個頭結點有效,因此 head此時既是頭結點,又是尾結點。因此將頭結點的位址賦給尾結點 end 因此:end = head。 此時end 就是 head, head 就是 end。 end->next 也自然指向的是 null。

尾插法建立第二個結點

建立完第乙個結點之後,我們入手建立第二個結點。 第乙個結點,end 和 head 共用一塊記憶體空間。現在從堆中心開闢出一塊記憶體給 node,將 node 的資料域賦值後,此時 end 中儲存的位址是 head 的位址。此時,end->next 代表的是頭結點的指標域,因此 end->next = node 代表的就是將上乙個,也就是新開闢的 node 的位址賦給 head 的下乙個結點位址。

此時,end->next 的位址是新建立的 node 的位址,而此時 end 的位址還是 head 的位址。 因此 end = node ,這條作用就是將新建的結點 node 的位址賦給尾結點 end。 此時 end 的位址不再是頭結點,而是新建的結點 node。

一句話,相當於不斷開創新的結點,然後不斷將新的結點的位址當做尾結點。尾結點不斷後移,而新創的結點時按照建立的先後順序而連線的。先來新到。

尾插法建立單鏈表,結點建立完畢

最後,當結點建立完畢,最後不會有新的結點來替換 end ,因此最後需要加上一條 end->next = null。將尾指標的指向為 null。

建立更多結點也自然容易理解了一些。

執行一次:

總結由上面的例子以及比較,我們可以看見:

單鏈表的頭插法與尾插法

頭插法 在頭結點 為了操作方便,在單鏈表的第乙個結點之前附加乙個結點,稱為頭結點。頭結點的資料域可以儲存資料標題 表長等資訊,也可以不儲存任何資訊,其指標域儲存第乙個結點的首位址 h之後插入資料,其特點是讀入的資料順序與線性表的邏輯順序正好相反。尾插法 將新節點插入到當前節點的表尾結點之後。incl...

頭插法與尾插法建立單鏈表

單鏈表的建立一般主流分為兩種建立方式 頭插法和尾插法。頭插法1 建立頭節點,維護head指標 引用 來指向頭節點 2 newnode表示待插入節點,維護newnode指向新節點 3 case1 當鍊表為空時,即首次插入新節點,將head.next指向新插入節點,即head.next newnode ...

頭插法和尾插法建立單鏈表

頭插法和尾插法建立單鏈表 include using namespace std typedef int elemtype typedef struct lnode linklist 頭插法建表 從尾部乙個乙個往前插入 void createlisthead linklist l,elemtype ...