談到鍊錶之前,先說一下線性表。線性表是最基本、最簡單、也是最常用的一種資料結構。線性表中資料元素之間的關係是一對一的關係,即除了第乙個和最後乙個資料元素之外,其它資料元素都是首尾相接的。線性表有兩種儲存方式,一種是順序儲存結構,另一種是鏈式儲存結構。
順序儲存結構就是兩個相鄰的元素在記憶體中也是相鄰的。這種儲存方式的優點是查詢的時間複雜度為o(1),通過首位址和偏移量就可以直接訪問到某元素,關於查詢的適配演算法很多,最快可以達到o(logn)。缺點是插入和刪除的時間複雜度最壞能達到o(n),如果你在第乙個位置插入乙個元素,你需要把陣列的每乙個元素向後移動一位,如果你在第乙個位置刪除乙個元素,你需要把陣列的每乙個元素向前移動一位。還有乙個缺點,就是當你不確定元素的數量時,你開的陣列必須保證能夠放下元素最大數量,遺憾的是如果實際數量比最大數量少很多時,你開的陣列沒有用到的記憶體就只能浪費掉了。
我們常用的陣列就是一種典型的順序儲存結構,如圖1。
鏈式儲存結構就是兩個相鄰的元素在記憶體中可能不是相鄰的,每乙個元素都有乙個指標域,指標域一般是儲存著到下乙個元素的指標。這種儲存方式的優點是插入和刪除的時間複雜度為o(1),不會浪費太多記憶體,新增元素的時候才會申請記憶體,刪除元素會釋放記憶體,。缺點是訪問的時間複雜度最壞為o(n),關於查詢的演算法很少,一般只能遍歷,這樣時間複雜度也是線性(o(n))的了,頻繁的申請和釋放記憶體也會消耗時間。
順序表的特性是隨機讀取,也就是訪問乙個元素的時間複雜度是o(1),鏈式表的特性是插入和刪除的時間複雜度為o(1)。要根據實際情況去選取適合自己的儲存結構。
鍊錶就是鏈式儲存的線性表。根據指標域的不同,鍊錶分為單向鍊錶、雙向鍊錶、迴圈鍊錶等等。
一、 單向鍊錶(slist)
鍊錶中最簡單的一種是單向鍊錶,每個元素包含兩個域,值域和指標域,我們把這樣的元素稱之為節點。每個節點的指標域內有乙個指標,指向下乙個節點,而最後乙個節點則指向乙個空值。如圖2就是乙個單向鍊錶。
我寫了乙個簡單的c++版單向鍊錶類模板,就用這段**講解一下乙個具體的單向鍊錶該怎麼寫(**僅供學習),當然首先你要具備c++基礎知識和簡單的模板元程式設計。
完整**
首先我們要寫乙個節點類,鍊錶中的每乙個節點就是乙個節點類的物件。如圖3。
基本資料結構 鍊錶
鍊錶 鍊錶與陣列的區別是鍊錶中的元素順序是有各物件中的指標決定的,相鄰元素之間在物理記憶體上不一定相鄰。採用鍊錶可以靈活地表示動態集合。鍊錶有單鏈表和雙鏈表及迴圈鍊錶。書中著重介紹了雙鏈表的概念及操作,雙鏈表l的每乙個元素是乙個物件,每個物件包含乙個關鍵字和兩個指標 next和prev。鍊錶的操作包...
基本資料結構(2) 鍊錶
鍊錶開發於1955 56,由當時所屬於蘭德公司 英語 rand corporation 的艾倫紐維爾 allen newell 克里夫肖 cliff shaw 和赫伯特西蒙 herbert simon 在他們編寫的資訊處理語言 ipl 中做為原始資料型別所編寫。ipl被作者們用來開發幾種早期的人工智...
基本資料結構單向鍊錶
第一次發文章,謬誤之處請各位大佬指正。單向鍊錶的原理還是很簡單的而且和雙向鍊錶有很多相同之處 而且鍊錶和二叉搜尋樹有著很多聯絡以後我會在二叉搜尋樹的章節中寫一篇將二叉搜尋樹改寫成煉表的文章 只改變指標的指向 一下在 的注釋中寫出鍊錶的實現 include include struct node he...