1,為什麼要使用鍊錶
1,順序表的長度是固定的,如果超出分配的長度就會造成溢位,如果存放的資料太少則會造成空間浪費。
2,在插入元素和刪除元素時(尤其不在尾部時),會移動大量的元素,造成效能和效率低下。
基於以上問題,使用鍊錶可以很好地避免順序表中出現的問題。這也是我們要使用鍊錶的原因。
2,鍊錶的儲存結構:
從上圖可以看出,單鏈表中的每個結點都包含乙個「資料域」和乙個「指標域」。「資料域」中包含當前結點的資料,「指標域」包含下一節點的儲存位址,頭指標head是指向開始結點的,結束結點沒有後繼結點,所以結束結點的指標域為空,即null。
3,鍊錶的常用操作及實現**
鍊錶常用的操作有:
1,插入結點到表頭
思路:將head頭指標的next指標給新增結點的next,然後將整個新增結點給head頭指標的next。因此時間複雜度為o(1)。
示意圖:
2,插入結點到表尾
思路:插入方法與插入到表頭一樣,只不過多乙個步驟就是通過head頭指標迴圈找到終端結點。因此時間複雜度為o(n)。
示意圖:
3,插入結點(1≤i≤listlength(l))
思路:插入方法與插入到表頭一樣,多迴圈查詢當前結點的動作。因此時間複雜度為o(n)。
示意圖:
4,刪除結點
思路:同插入結點一樣,時間複雜度為o(n)。
示意圖:
5,查詢結點
思路:與插入結點和刪除結點方法類似,時間複雜度為o(n)。
6,獲取鍊錶長度
思路:不像順序表是連續儲存的,獲取表的長度非常容易。在鍊錶中,資料不是連續儲存的,因此需要迴圈遍歷才能求得鍊錶的長度,所以時間複雜度為o(n)。
namespace ds.bll
/// /// 插入結點在表尾
///
///
///
///
///
public static nodeinsertend(nodehead, t data)
getlastnode(head).next = node;
return head;
}/// /// 插入結點(在包含關鍵字key的結點之後插入新的結點)
///
///
///
///
///
public static nodeinsert(nodehead,string key,funcwhere, t data) where w:icomparable
insert(head.next,key,where,data); //用遞迴繼續查詢下乙個結點
return head;
}/// /// 刪除結點(刪除包含關鍵字key的結點)
///
///
///
///
///
///
///
public static nodedelete(nodehead, string key, funcwhere) where w : icomparable
else
}delete(head.next,key,where); //使用遞迴繼續查詢
return head;
}/// /// 查詢結點(查詢包含關鍵字key的結點)
///
///
///
///
///
///
///
public static nodegetnodebykey(nodehead, string key, funcwhere) where w : icomparable
/// /// 獲取鍊錶長度
///
///
///
///
public static int getlength(nodehead)
return count;
}private static nodegetlastnode(nodehead)
}/// /// 封裝鍊錶
///
///
public class node
}
線性表之鍊錶
鏈式的線性表適用於經常進行刪除,插入操作的工作,如 訂票系統。鍊錶是用乙個乙個的節點連線起來的表,在物理上不是連續的,在邏輯上是連續的。通過節點間的指標指向來表示節點間的關係。所以在進行鍊錶操作之前,要先定義乙個節點結構。節點結構包含兩個東西 資料域,指標域。資料域就是用來存放資料的,指標域是用來表...
線性表之鍊錶
1.初始化 void initlist list plist assert plist null if plist null plist data 不使用 plist next null 2.頭插 bool insert head list plist,int val 時間複雜度為o 1 node ...
線性表之鍊錶
1 實驗專案一 線性表的基本操作及其應用 兩次實驗課完成 definition of sequential list typedef struct sqlist definition of linked list typedef struct lnodelnode,linklist 實驗要求 1 程...