一步一計算(單向鍊錶)

2021-08-01 21:36:38 字數 1794 閱讀 7225

有的時候,處於記憶體中的資料並不是連續的。那麼這時候,我們就需要在資料結構中新增乙個屬性,這個屬性會記錄下面乙個資料的位址。有了這個位址之後,所有的資料就像一條鍊子一樣串起來了,那麼這個位址屬性就起到了穿線鏈結的作用。

相比較普通的線性結構,鍊錶結構的優勢是什麼呢?我們可以總結一下:

(1)單個節點建立非常方便,普通的線性記憶體通常在建立的時候就需要設定資料的大小

(2)節點的刪除非常方便,不需要像線性結構那樣移動剩下的資料

(3)節點的訪問方便,可以通過迴圈或者遞迴的方法訪問到任意資料,但是平均的訪問效率低於線性表

那麼在實際應用中,鍊錶是怎麼設計的呢?我們可以以int資料型別作為基礎,設計乙個簡單的int鍊錶:

(1)設計鍊錶的資料結構

[cpp]view plain

copy

typedef

struct

_link_node  

link_node;  

(2)建立鍊錶

[cpp]view plain

copy

link_node* alloca_node(

intvalue)    

(3)刪除鍊錶

[cpp]view plain

copy

void

delete_node(link_node** pnode)    

(4)鍊錶插入資料

[cpp]view plain

copy

status _add_data(link_node** pnode, link_node* pdatanode)  

return

_add_data(&(*pnode)->next, pdatanode);  

}  status add_data(const

link_node** pnode, 

intvalue)    

(5)刪除資料

[cpp]view plain

copy

status _delete_data(link_node** pnode, 

intvalue)  

else

}  status delete_data(link_node** pnode, int

value)  

return

_delete_data(pnode, value);  

}  

(6)查詢資料

[cpp]view plain

copy

link_node* find_data(

const

link_node* plinknode, 

intvalue)    

(7)列印資料

[cpp]view plain

copy

void

print_node(

const

link_node* plinknode)  

}  (8)統計資料

[cpp]view plain

copy

intcount_node(

const

link_node* plinknode)  

一步一步學鍊錶

首先是基本框架 1.錄入鍊錶 2.插入乙個元素 3.刪除乙個元素 4.遍歷鍊錶,輸出所有 5.鍊錶排序 6.退出 看了一下資料,了解了不少,寫了基本框架,今天先把錄入和輸出給實現了吧!先把 貼出來 首先是主函式 include include define null 0 typedef struct...

一步一步寫演算法(之鍊錶排序)

相比較線性表的排序而言,鍊錶排序的內容稍微麻煩一點。一方面,你要考慮資料插入的步驟 另外一方面你也要對指標有所顧慮。要是有一步的內容錯了,那麼作業系統會馬上給你彈出乙個exception。就鍊錶的特殊性而言,適合於鍊錶的排序有哪些呢?1 插入排序 適合 2 氣泡排序 適合 3 希爾排序 適合 4 選...

一步一步寫演算法(之鍊錶重合)

鍊錶重合是乙個好玩的問題。原題目是這樣的 有兩個鍊錶,那麼如何判斷這兩個鍊錶是不是重合的?至於這個鍊錶在什麼時候重合的,這不重要,關鍵是判斷這個鍊錶究竟有沒有重合。究竟有什麼方法呢?最簡單的方法就是檢視兩者有沒有共同點。那麼依次判斷就行了。int find node in link link nod...