現在我們可以回頭總結一下我們的鍊錶:
- 鍊錶是乙個由節點組成的一條鏈。
- 每個節點包含兩條資訊:
- 序列中儲存的是一些資料
- 節點中有指向列表中下乙個節點的鏈結。
- 我們可以從第乙個單元格開始跟隨著link指標,遍歷整個鍊錶。
如同下圖所示(左邊是乙個節點,右邊是由節點組成的鍊錶)
- 鍊錶是用於儲存元素序列的資料結構。
- 每個元素與其他元素分開儲存。
- 然後將這些元素鏈結在一起成為乙個序列
例如我們從尾部插入乙個元素,過程如下:
從中間插入元素過程如下:
刪除元素如下:
struct node ;
struct node ;
發現沒,這個結構居然是被遞迴定義的!!,也就是說每生成乙個新的節點,就必然有乙個指向下乙個節點的指標生成。
在分析鍊錶的過程中,一定要記住,我們是需要畫圖理解的!!!
在peter jackson的電影《指環王》——「國王回歸」中,rohan通過山頂的一連串訊號火災警告了gondor的危險。 這個場景是乙個很好的例子,說明了在鍊錶中傳遞訊息的這個想法。
struct tower;
接下來,我們應該是建立第乙個節點:
// 為什麼我們要從最後乙個節點開始?因為它的成員是確定的
tower * head =
new tower;
head->name = 「san jose」;
head->
link
=null;
//建立乙個節點,並返回乙個指向當前節點的指標
tower *createtower(string name, tower *
link)
接下來我們要把他們串起來:
head = createtower("santa clara", head);
head = createtower("mountain view", head);
head = createtower("palo alto", head);
head = createtower("menlo park", head);
head = createtower("redwood city", head);
head = createtower("millbrae", head);
head = createtower("bayshore", head);
head = createtower("san francisco", head);
當呼叫第乙個createtower的時候,他這樣執行(2)過程,為了按照要求,我也畫圖分析
最後我們展示一下我們的鍊錶:
//遍歷
void signal(tower *start)
}
當節點不為空時,輸出節點的資料。從頭到尾遍歷。
#include
using namespace std;
/*宣告部分*/
struct tower;
/*函式宣告*/
tower *createtower(string name, tower*
link);
void signal(tower *start);
/*main函式*/
int main()
//建立乙個節點,並返回乙個指向當前節點的指標
tower *createtower(string name, tower *
link)
//遍歷
void signal(tower *start)
}
測試結果:
由此我們得到一般的節點的結構組成:
struct node;
資料結構3 鍊錶
鍊錶是儲存許多同型別的資料元素組成的有序列表。鍊錶如同火車,人數決定車箱數,人多就向系統申請多加乙個車廂,人少就去除乙個車廂。這種動態分配記憶體的方式,按需分配,可以避免記憶體的浪費。int p val int型別的指標p指向val 動態記憶體分配 就是程式在執行的時候向系統申請記憶體,程式執行結束...
面試 資料結構(3)(鍊錶)
1 除了用陣列描述線性表還可以用鍊錶描述線性表 2在鏈式描述中,線性表的元素在記憶體中的儲存位置是隨機的。每個元素都有乙個明確的指標或鏈指向線性表的下乙個元素的位置 即位址 陣列和鍊錶的區別 在陣列中,元素的位址是由數學公式決定的,而在鏈式描述中,元素的位址是隨機分布的 順序表是順序儲存,非順序訪問...
資料結構 鍊錶(3) 鍊錶的逆序
鍊錶的逆序 鍊錶的只逆序輸出,鍊錶不逆序,第二種是鍊錶的逆序。面試中經常考察鍊錶的逆序。總結鍊錶逆序的五個主要步驟 2 將當前結點的指標域指向當前結點的前乙個結點 3 將當前結點後移 4 將當前結點的前一結點的指標後移,進行迴圈 5 逆序之後的原來的頭指標的指標域為空。並建立新的頭結點 建立結構體 ...