線性表的順序存儲結構要求邏輯關系上相鄰的元素在物理位置上也相鄰,這樣方便了隨機存取,但是在插入和刪除元素時,需要移動大量元素,而線性表的鏈式存儲則不要求邏輯上相鄰的元素在物理位置上也相鄰,因此它沒有順序存儲結構的可隨機存取的優點,不過在插入和刪除元素時比較方便。
單鏈表
單鏈表可由頭指針唯一確定,在C語言中可用“結構指針”來描述:
1: typedef struct Node {
2: ElemType data;
3: struct Node *next;
4: }Node, *LinkList;
有時,我們會在單鏈表的第一個結點之前附設一個結點,稱之為頭結點。頭結點的數據域可以不存儲任何信息,也可以存儲如鏈表的長度等一些附加信息。頭結點的指針域指向第一個結點,如果線性表為空,則頭結點的指針域為NULL。
循環鏈表
表中最后一個結點的指針域指向第一個結點,整個鏈表形成一個環。
循環鏈表的操作與單鏈表基本一致,差別在於算法中的循環條件不是p或者p->next是否為空, 而是他們是否等於頭指針。
有時候,在循環鏈表中設立尾指針而不設頭指針,可以使某些操作簡化。
雙向鏈表
在雙向鏈表的結點中有兩個指針域, 其一指向直接后繼,另一指向直接前驅,在C語言中可描述如下:
1: typedef struct Node {
2: ElemType data;
3: struct Node *next, *prev;
4: }Node, *LinkList;
和單鏈表的循環鏈表類似,雙向鏈表也可以有循環鏈表。