add disconnect function to SimpleGraph

This commit is contained in:
sigil-03 2025-05-23 22:40:48 -06:00
parent f8d75ee7fa
commit 68b80f5b98
3 changed files with 35 additions and 10 deletions

View file

@ -1 +1,3 @@
pub trait Edge {} pub trait Edge {
type HANDLE;
}

View file

@ -7,11 +7,11 @@ pub trait Graph<V: Vertex, E: Edge> {
// TODO: figure out a way to modify self? is that even needed? // TODO: figure out a way to modify self? is that even needed?
// same for `disconnect()` // same for `disconnect()`
// fn connect(vertex_1: &V, vertex_2: &V) -> E; // fn connect(vertex_1: &V, vertex_2: &V) -> E;
fn connect(&mut self, vertex_1: V::HANDLE, vertex_2: V::HANDLE); fn connect(&mut self, vertex_1: V::HANDLE, vertex_2: V::HANDLE) -> E::HANDLE;
// disconnect two nodes, and return the old edge // disconnect two nodes, and return the old edge
// fn disconnect(vertex_1: &V, vertex_2: &V) -> E; // fn disconnect(vertex_1: &V, vertex_2: &V) -> E;
fn disconnect(&mut self, vertex_1: V::HANDLE, vertex_2: V::HANDLE); fn disconnect(&mut self, edge: E::HANDLE);
// get the degree of a given vertex - possibly put this in a GraphUtil trait? // get the degree of a given vertex - possibly put this in a GraphUtil trait?
fn degree(vertex: V::HANDLE) -> usize; fn degree(vertex: V::HANDLE) -> usize;

View file

@ -8,7 +8,9 @@ struct SimpleEdge {
v2: usize, v2: usize,
} }
impl Edge for SimpleEdge {} impl Edge for SimpleEdge {
type HANDLE = usize;
}
struct SimpleVertex { struct SimpleVertex {
id: usize, id: usize,
@ -32,16 +34,24 @@ struct SimpleGraph {
impl SimpleGraph {} impl SimpleGraph {}
impl<'a> Graph<SimpleVertex, SimpleEdge> for SimpleGraph { impl<'a> Graph<SimpleVertex, SimpleEdge> for SimpleGraph {
fn connect(&mut self, vertex_1: usize, vertex_2: usize) { fn connect(&mut self, vertex_1: usize, vertex_2: usize) -> usize {
let id = self.edges.len();
self.edges.push(SimpleEdge { self.edges.push(SimpleEdge {
id: self.edges.len(), id: id.clone(),
v1: vertex_1, v1: vertex_1,
v2: vertex_2, v2: vertex_2,
}); });
id
} }
fn disconnect(&mut self, vertex_1: usize, vertex_2: usize) { // NOTE: this should probably be a failable function... and use a hashmap
todo!(); fn disconnect(&mut self, edge: usize) {
for i in (0..self.edges.len()) {
if self.edges[i].id == edge {
self.edges.remove(i);
return;
}
}
} }
fn degree(vertex: usize) -> usize { fn degree(vertex: usize) -> usize {
@ -60,7 +70,7 @@ fn test_connect() {
vertices: vec![v1, v2], vertices: vec![v1, v2],
edges: Vec::new(), edges: Vec::new(),
}; };
g.connect(0, 1); let _e = g.connect(0, 1);
assert_eq!(g.edges.len(), 1); assert_eq!(g.edges.len(), 1);
assert_eq!(g.edges[0].id, 0); assert_eq!(g.edges[0].id, 0);
assert_eq!(g.edges[0].v1, 0); assert_eq!(g.edges[0].v1, 0);
@ -69,7 +79,20 @@ fn test_connect() {
#[test] #[test]
fn test_disconnect() { fn test_disconnect() {
todo!(); let v1 = SimpleVertex { id: 0 };
let v2 = SimpleVertex { id: 1 };
let mut g = SimpleGraph {
vertices: vec![v1, v2],
edges: Vec::new(),
};
let e = g.connect(0, 1);
assert_eq!(g.edges.len(), 1);
assert_eq!(g.edges[0].id, 0);
assert_eq!(g.edges[0].v1, 0);
assert_eq!(g.edges[0].v2, 1);
g.disconnect(e);
assert_eq!(g.edges.len(), 0);
} }
#[test] #[test]