@@ -11,7 +11,7 @@ use std::collections::HashMap;
1111/* 基于邻接表实现的无向图类型 */
1212pub struct GraphAdjList {
1313 // 邻接表,key:顶点,value:该顶点的所有邻接顶点
14- pub adj_list : HashMap < Vertex , Vec < Vertex > > ,
14+ pub adj_list : HashMap < Vertex , Vec < Vertex > > , // maybe HashSet<Vertex> for value part is better?
1515}
1616
1717impl GraphAdjList {
@@ -38,31 +38,27 @@ impl GraphAdjList {
3838
3939 /* 添加边 */
4040 pub fn add_edge ( & mut self , vet1 : Vertex , vet2 : Vertex ) {
41- if !self . adj_list . contains_key ( & vet1) || !self . adj_list . contains_key ( & vet2) || vet1 == vet2
42- {
41+ if vet1 == vet2 {
4342 panic ! ( "value error" ) ;
4443 }
4544 // 添加边 vet1 - vet2
46- self . adj_list . get_mut ( & vet1) . unwrap ( ) . push ( vet2) ;
47- self . adj_list . get_mut ( & vet2) . unwrap ( ) . push ( vet1) ;
45+ self . adj_list . entry ( vet1) . or_default ( ) . push ( vet2) ;
46+ self . adj_list . entry ( vet2) . or_default ( ) . push ( vet1) ;
4847 }
4948
5049 /* 删除边 */
5150 #[ allow( unused) ]
5251 pub fn remove_edge ( & mut self , vet1 : Vertex , vet2 : Vertex ) {
53- if !self . adj_list . contains_key ( & vet1) || !self . adj_list . contains_key ( & vet2) || vet1 == vet2
54- {
52+ if vet1 == vet2 {
5553 panic ! ( "value error" ) ;
5654 }
5755 // 删除边 vet1 - vet2
5856 self . adj_list
59- . get_mut ( & vet1)
60- . unwrap ( )
61- . retain ( |& vet| vet != vet2) ;
57+ . entry ( vet1)
58+ . and_modify ( |v| v. retain ( |& e| e != vet2) ) ;
6259 self . adj_list
63- . get_mut ( & vet2)
64- . unwrap ( )
65- . retain ( |& vet| vet != vet1) ;
60+ . entry ( vet2)
61+ . and_modify ( |v| v. retain ( |& e| e != vet1) ) ;
6662 }
6763
6864 /* 添加顶点 */
@@ -77,9 +73,6 @@ impl GraphAdjList {
7773 /* 删除顶点 */
7874 #[ allow( unused) ]
7975 pub fn remove_vertex ( & mut self , vet : Vertex ) {
80- if !self . adj_list . contains_key ( & vet) {
81- panic ! ( "value error" ) ;
82- }
8376 // 在邻接表中删除顶点 vet 对应的链表
8477 self . adj_list . remove ( & vet) ;
8578 // 遍历其他顶点的链表,删除所有包含 vet 的边
0 commit comments