一、什么是鏈表
鏈表(Linked List)是由許多相同數據類型的數據項按照特定順序排列而成的線性表。但鏈表的特性是其各個數據項在計算機內存中的位置是不連續且隨機(Random)存放的。
1、優點
數據的插入和刪除都相當方便,有新數據插入就向系統申請一塊內存空間,而數據被刪除后,就可以把這塊內存空間還給系統,加入和刪除都不需要移動大量的數據。
2、缺點
設計數據結構時比較麻煩,並且在查找數據時,也無法像靜態數據(如數組)那樣可以隨機讀取數據,必須要按序查找到該數據為止。
3、應用
日常生活中有許多鏈表的抽象運用,例如可以把“單向鏈表”想象成火車,有多少人就掛多少節車廂,當假日人多時,需要較多車廂時就多掛些車廂,人少時就把車廂數量減少,十分有彈性。像游樂場中的摩天輪就是一種“環形鏈表”的應用,可以根據需要增加坐廂的數量。
二、動態分配內存
鏈表與數組的最大不同點,就是它的各個元素或數據項的存儲不必在連續的內存中(即不必分配連續存儲的空間給它們),只要考慮它們在邏輯上的順序即可。雖然數組結構也可以用來仿真鏈表的結構,但在進行增刪或移動元素時相當不便,而且必須事先聲明固定的數組空間,太多或太少各有利弊,缺乏彈性。因此,使用動態分配內存的模式,最適合鏈表數據結構的設計。
“動態分配內存”(Dynamic Allocation)的基本精神就是:讓內存的使用更具彈性,即可在程序執行期間根據用戶的設置與需求,適當給變量分配所需要的內存空間。雖然動態分配內存比靜態分配內存方式更具有彈性,但是動態分配內存也有不利之處。下表列出了靜態內存分配和動態分配內存兩種方式的相關比較。
相關比較表 | 動態分配 | 靜態分配 |
內存分配 | 運行階段 | 編譯階段 |
內存釋放 | 程序結束前必須釋放分配的內存空間,否則造成內存“泄露”(Memory Leak) | 不需釋放,程序結束時自動歸還給系統 |
程序運行性能 | 較低。(因為所需內存要到程序執行時才能分配) | 較高。(程序編譯階段即已確定所需分配的內存容量) |
指針遺失 | 若指向動態分配空間的指針在未釋放該地址空間之前,又指向了別的內存空間時,則原本所指向的內存空間將無法被釋放,而造成內存“泄露” | 沒有此問題。 |