From 381d898d860fd6594f43f65b3bb1de51fb7fcb47 Mon Sep 17 00:00:00 2001 From: rei2hu Date: Thu, 28 Sep 2017 10:15:39 -0500 Subject: [PATCH 1/2] add adjacency list implementation for graphs --- data_structures/Graphs/Graphs.java | 136 ++++++++++++++++++++++++----- data_structures/Graphs/makefile | 3 + 2 files changed, 116 insertions(+), 23 deletions(-) create mode 100644 data_structures/Graphs/makefile diff --git a/data_structures/Graphs/Graphs.java b/data_structures/Graphs/Graphs.java index a3eb0ff6..aa964f7e 100644 --- a/data_structures/Graphs/Graphs.java +++ b/data_structures/Graphs/Graphs.java @@ -1,32 +1,122 @@ +import java.util.ArrayList; +import java.lang.StringBuilder; -/** - * This class implements the Graph data structure - * using the classes Graph and Graphs. - * - * @author Zachary Jones - * - */ -class Graph { +class AdjacencyListGraph> { -} + ArrayList verticies; -/** - * This class is used to test the Graph - * class above. - * - * @author Zachary Jones - * - */ + public AdjacencyListGraph() { + verticies = new ArrayList<>(); + } + + private class Vertex { + E data; + ArrayList adjacentVerticies; + + public Vertex(E data) { + adjacentVerticies = new ArrayList<>(); + this.data = data; + } + + public boolean addAdjacentVertex(Vertex to) { + for (Vertex v: adjacentVerticies) { + if (v.data.compareTo(to.data) == 0) { + return false; // the edge already exists + } + } + return adjacentVerticies.add(to); // this will return true; + } + + public boolean removeAdjacentVertex(E to) { + // use indexes here so it is possible to + // remove easily without implementing + // equals method that ArrayList.remove(Object o) uses + for (int i = 0; i < adjacentVerticies.size(); i++) { + if (adjacentVerticies.get(i).data.compareTo(to) == 0) { + adjacentVerticies.remove(i); + return true; + } + } + return false; + } + } + + /** + * @param from the data of the vertex the edge is from + * @param to the data of the vertex the edge is going to + * @return returns false if the edge doesn't exist, returns true if the edge exists and is removed + */ + public boolean removeEdge(E from, E to) { + Vertex fromV = null; + for (Vertex v: verticies) { + if (from.compareTo(v.data) == 0) { + fromV = v; + break; + } + } + if (fromV == null) return false; + return fromV.removeAdjacentVertex(to); + } + /** + * @param from the data of the vertex the edge is from + * @param to the data of the vertex the edge is going to + * @return returns true if the edge did not exist, return false if it already did + */ + public boolean addEdge(E from, E to) { + Vertex fromV = null, toV = null; + for (Vertex v: verticies) { + if (from.compareTo(v.data) == 0) { // see if from vertex already exists + fromV = v; + } else if (to.compareTo(v.data) == 0) { // see if to vertex already exists + toV = v; + } + if (fromV != null && toV != null) break; // both nodes exist so stop searching + } + if (fromV == null) { + fromV = new Vertex(from); + verticies.add(fromV); + } + if (toV == null) { + toV = new Vertex(to); + verticies.add(toV); + } + return fromV.addAdjacentVertex(toV); + } + + /** + * + * @return returns a string describing this graph + */ + public String toString() { + StringBuilder sb = new StringBuilder(); + for (Vertex v: verticies) { + sb.append("Vertex: "); + sb.append(v.data); + sb.append("\n"); + sb.append("Adjacent verticies: "); + for (Vertex v2: v.adjacentVerticies) { + sb.append(v2.data); + sb.append(" "); + } + sb.append("\n"); + } + return sb.toString(); + } +} public class Graphs { - /** - * Main method - * - * @param args Command line arguments - */ public static void main(String args[]) { - - } + AdjacencyListGraph graph = new AdjacencyListGraph<>(); + assert graph.addEdge(1, 2); + assert graph.addEdge(1, 5); + assert graph.addEdge(2, 5); + assert !graph.addEdge(1, 2); + assert graph.addEdge(2, 3); + assert graph.addEdge(3, 4); + assert graph.addEdge(4, 1); + assert !graph.addEdge(2, 3); + System.out.println(graph); + } } diff --git a/data_structures/Graphs/makefile b/data_structures/Graphs/makefile new file mode 100644 index 00000000..7361b405 --- /dev/null +++ b/data_structures/Graphs/makefile @@ -0,0 +1,3 @@ +test: + javac Graphs.java + java -ea Graphs From 9b566f94416a1f3c555a934ee6e1f2574beae1f6 Mon Sep 17 00:00:00 2001 From: rei2hu Date: Thu, 28 Sep 2017 10:40:18 -0500 Subject: [PATCH 2/2] remove makefile and update docs --- data_structures/Graphs/Graphs.java | 7 +++++++ data_structures/Graphs/makefile | 3 --- 2 files changed, 7 insertions(+), 3 deletions(-) delete mode 100644 data_structures/Graphs/makefile diff --git a/data_structures/Graphs/Graphs.java b/data_structures/Graphs/Graphs.java index aa964f7e..2e5db708 100644 --- a/data_structures/Graphs/Graphs.java +++ b/data_structures/Graphs/Graphs.java @@ -42,6 +42,9 @@ class AdjacencyListGraph> { } /** + * this method removes an edge from the graph between two specified + * verticies + * * @param from the data of the vertex the edge is from * @param to the data of the vertex the edge is going to * @return returns false if the edge doesn't exist, returns true if the edge exists and is removed @@ -58,6 +61,9 @@ class AdjacencyListGraph> { return fromV.removeAdjacentVertex(to); } /** + * this method adds an edge to the graph between two specified + * verticies + * * @param from the data of the vertex the edge is from * @param to the data of the vertex the edge is going to * @return returns true if the edge did not exist, return false if it already did @@ -84,6 +90,7 @@ class AdjacencyListGraph> { } /** + * this gives a list of verticies in the graph and their adjacencies * * @return returns a string describing this graph */ diff --git a/data_structures/Graphs/makefile b/data_structures/Graphs/makefile deleted file mode 100644 index 7361b405..00000000 --- a/data_structures/Graphs/makefile +++ /dev/null @@ -1,3 +0,0 @@ -test: - javac Graphs.java - java -ea Graphs