diff --git a/graph/AdjacencyListGraph.java b/graph/AdjacencyListGraph.java new file mode 100644 index 0000000..895a1d1 --- /dev/null +++ b/graph/AdjacencyListGraph.java @@ -0,0 +1,320 @@ +package graph; + +/** + * Created with xgiovio.macbookair. + * User: xgiovio + * Date: 19/05/14 + * Time: 16:30 + */ + +import java.util.Iterator; + +/** + * An realization of a graph according to adjacency list structure. + * + * @author Roberto Tamassia, Eric Zamore + */ + +public class AdjacencyListGraph implements Graph { + + protected NodePositionList> VList; // container for vertices + protected NodePositionList> EList; // container for edges + /** Default constructor that creates an empty graph */ + public AdjacencyListGraph() { + VList = new NodePositionList>(); + EList = new NodePositionList>(); + } + /** Return an iterator over the vertices of the graph */ + public Iterable> vertices() { + return VList; + } + /** Return an iterator over the edges of the graph */ + public Iterable> edges() { + return EList; + } + /** Replace the element a given position (vertex or edge) with a new + element and return the old element */ + public Object replace(Position p, Object o) + throws InvalidPositionException { + MyPosition pp = checkPosition(p); + Object temp = p.element(); + pp.setElement(o); + return temp; + } + /** Return an iterator over the edges incident on a vertex */ + public Iterable> incidentEdges(Vertex v) + throws InvalidPositionException { + MyVertex vv = checkVertex(v); + return vv.incidentEdges(); + + } + /** Return the endvertices of a edge in an array of length 2 */ + public Vertex[] endVertices(Edge e) + throws InvalidPositionException { + MyEdge ee = checkEdge(e); + return ee.endVertices(); + } + /** Return the other endvertex of an incident edge */ + public Vertex opposite(Vertex v, Edge e) + throws InvalidPositionException { + checkVertex(v); + MyEdge ee = checkEdge(e); + Vertex[] endv = ee.endVertices(); + if (v == endv[0]) + return endv[1]; + else if (v == endv[1]) + return endv[0]; + else + throw new InvalidPositionException("No such vertex exists"); + } + /** Test whether two vertices are adjacent */ + public boolean areAdjacent(Vertex u, Vertex v) + throws InvalidPositionException { + // search the incidence list of the vertex with smaller degree + Iterable> iterToSearch; + if (degree(u) < degree(v)) { + iterToSearch = incidentEdges(u); + } + else { + iterToSearch = incidentEdges(v); + } + for (Edge e: iterToSearch ) { + Vertex[] endV = endVertices(e); + // if there exists an edge whose endpoints are u and v + if ((endV[0] == u && endV[1] == v) || (endV[0] == v && endV[1] == u)) + return true; + } + return false; + } + /** Insert and return a new vertex with a given element */ + public Vertex insertVertex(V o) { + MyVertex vv = new MyVertex(o); + VList.addLast(vv); + Position> p = VList.last(); + vv.setLocation(p); + return vv; + } + /** Insert and return a new edge with a given element between two + vertices */ + public Edge insertEdge(Vertex v, Vertex w, E o) + throws InvalidPositionException { + MyVertex vv = checkVertex(v); + MyVertex ww = checkVertex(w); + MyEdge ee = new MyEdge(v, w, o); + Position> pv = vv.insertIncidence(ee); + Position> pw = ww.insertIncidence(ee); + ee.setIncidences(pv, pw); + EList.addLast(ee); + Position> pe = EList.last(); + ee.setLocation(pe); + return ee; + } + /** Remove a vertex and all its incident edges and return the + element stored at the removed vertex */ + public V removeVertex(Vertex v) + throws InvalidPositionException { + MyVertex vv = checkVertex(v); + Iterator> inc = incidentEdges(v).iterator(); + while (inc.hasNext()) { + MyEdge e = (MyEdge) inc.next(); + if (e.location() != null) // if the edge has not been marked invalid + removeEdge(e); + } + VList.remove(vv.location()); + return v.element(); + } + /** Remove an edge and return its element */ + public E removeEdge(Edge e) + throws InvalidPositionException { + MyEdge ee = checkEdge(e); + MyVertex[] endv = ee.endVertices(); + Position>[] inc = ee.incidences(); + endv[0].removeIncidence(inc[0]); + endv[1].removeIncidence(inc[1]); + EList.remove(ee.location()); + ee.setLocation(null); // invalidating this edge + return e.element(); + } + + // Auxiliary methods + + /** Return the degree of a given vertex */ + public int degree(Vertex v) { + MyVertex vv = checkVertex(v); + return vv.degree(); + } + + /** Determines whether a given position is valid. */ + protected MyPosition checkPosition(Position p) + throws InvalidPositionException { + if (p == null || !(p instanceof MyPosition)) + throw new InvalidPositionException("Position is invalid"); + return (MyPosition) p; + } + + /** Determines whether a given vertex is valid. */ + protected MyVertex checkVertex(Vertex v) + throws InvalidPositionException { + if (v == null || !(v instanceof MyVertex)) + throw new InvalidPositionException("Vertex is invalid"); + return (MyVertex) v; + } + + /** Determines whether a given edge is valid. */ + protected MyEdge checkEdge(Edge e) + throws InvalidPositionException { + if (e == null || !(e instanceof MyEdge)) + throw new InvalidPositionException("Edge is invalid"); + return (MyEdge) e; + } + + /** Implementation of a decorable position by means of a hash + * table. */ + protected static class MyPosition + extends HashTableMap implements DecorablePosition { + /** The element stored at this position. */ + protected T elem; + /** Returns the element stored at this position. */ + public T element() { + return elem; + } + /** Sets the element stored at this position. */ + public void setElement(T o) { + elem = o; + } + } + + /** Returns a string representation of the vertex and edge lists, + * separated by a newline. */ + public String toString() { + return VList.toString() + "\n" + EList.toString(); + } + + public int numVertices() { + return VList.size(); + } + + public int numEdges() { + return EList.size(); + } + + public V replace(Vertex p, V o) throws InvalidPositionException { + V temp = p.element(); + MyVertex vv = checkVertex(p); + vv.setElement(o); + return temp; + } + + public E replace(Edge p, E o) throws InvalidPositionException { + E temp = p.element(); + MyEdge ee = checkEdge(p); + ee.setElement(o); + return temp; + } + + /** Implementation of a vertex for an undirected adjacency list + * graph. Each vertex stores its incidence container and position + * in the vertex container of the graph. */ + protected class MyVertex + extends MyPosition implements Vertex { + /** Incidence container of the vertex. */ + protected PositionList> incEdges; + /** Position of the vertex in the vertex container of the graph. */ + protected Position> loc; + /** Constructs the vertex with the given element. */ + MyVertex(V o) { + elem = o; + incEdges = new NodePositionList>(); + } + /** Return the degree of a given vertex */ + public int degree() { + return incEdges.size(); + } + /** Returns the incident edges on this vertex. */ + public Iterable> incidentEdges() { + return incEdges; + } + /** Inserts an edge into the incidence container of this vertex. */ + public Position> insertIncidence(Edge e) { + incEdges.addLast(e); + return incEdges.last(); + } + /** Removes an edge from the incidence container of this vertex. */ + public void removeIncidence(Position> p) { + incEdges.remove(p); + } + /** Returns the position of this vertex in the vertex container of + * the graph. */ + public Position> location() { + return loc; + } + /** Sets the position of this vertex in the vertex container of + * the graph. */ + public void setLocation(Position> p) { + loc = p; + } + /** Returns a string representation of the element stored at this + * vertex. */ + public String toString() { + return elem.toString(); + } + } + + /** Implementation of an edge for an undirected adjacency list + * graph. Each edge stores its endpoints (end vertices), its + * positions within the incidence containers of its endpoints, and + * position in the edge container of the graph. */ + protected class MyEdge extends MyPosition implements Edge { + + /** The end vertices of the edge. */ + protected MyVertex[] endVertices; + /** The positions of the entries for the edge in the incidence + * containers of the end vertices. */ + protected Position>[] Inc; + /** The position of the edge in the edge container of the + * graph. */ + protected Position> loc; + + /** Constructs an edge with the given endpoints and elements. */ + MyEdge (Vertex v, Vertex w, E o) { + elem = o; + endVertices = (MyVertex[]) new MyVertex[2]; + endVertices[0] = (MyVertex)v; + endVertices[1] = (MyVertex)w; + Inc = (Position>[]) new Position[2]; + } + /** Returns the end vertices of the edge. There are always two + * elements in the returned array. */ + public MyVertex[] endVertices() { + return endVertices; + } + /** Returns the positions of the edge in the incidence containers + * of its end vertices. The returned array always contains two + * elements. */ + public Position>[] incidences() { + return Inc; + } + /** Sets the positions of the edge in the incidence containers of + * its end vertices. */ + public void setIncidences(Position> pv, Position> pw) { + Inc[0] = pv; + Inc[1] = pw; + } + /** Returns the position of the edge in the edge container of the + * graph. */ + public Position> location() { + return loc; + } + /** Sets the position of the edge in the edge container of the + * graph. */ + public void setLocation(Position> p) { + loc = p; + } + /** Returns a string representation of the edge via a tuple of + * vertices. */ + public String toString() { + return element() + "(" + endVertices[0].toString() + + "," + endVertices[1].toString() + ")"; + } + } +} \ No newline at end of file diff --git a/partition/ListPartition.java b/partition/ListPartition.java new file mode 100644 index 0000000..448e083 --- /dev/null +++ b/partition/ListPartition.java @@ -0,0 +1,39 @@ +package partition; + +import set.Set; + +/** + * Created with xgiovio.macbookair. + * User: xgiovio + * Date: 19/05/14 + * Time: 15:02 + */ +public class ListPartition implements Partition { + + + + @Override + public int size() { + return 0; + } + + @Override + public boolean isEmpty() { + return false; + } + + @Override + public Set makeSet(E x) { + return null; + } + + @Override + public Set union(Set A, Set B) { + return null; + } + + @Override + public Set find(E x) { + return null; + } +} diff --git a/partition/Partition.java b/partition/Partition.java new file mode 100644 index 0000000..5260054 --- /dev/null +++ b/partition/Partition.java @@ -0,0 +1,26 @@ +package partition; + +import set.Set; + +/** + * Created with xgiovio.macbookair. + * User: xgiovio + * Date: 19/05/14 + * Time: 14:24 + */ + +public interface Partition { + + public int size(); + public boolean isEmpty(); + + // Restituisce l’insieme contenente il solo elemento x + public Set makeSet(E x) ; + + // Restituisce l’unione di A e B, distruggendo i vecchi insiemi A e B + public Set union(Set A, Set B) ; + + // restituisce l’insieme che contiene l’elemento x + public Set find(E x) ; + +} \ No newline at end of file diff --git a/set/OrderedListSet.java b/set/OrderedListSet.java index 9db9606..bf5d8dd 100644 --- a/set/OrderedListSet.java +++ b/set/OrderedListSet.java @@ -40,6 +40,20 @@ public class OrderedListSet implements Set { c = in_c; } + public OrderedListSet(E in_e,Comparator in_c ){ + L = new NodePositionList(); + L.addLast(in_e); + c = in_c; + } + + public OrderedListSet(E in_e){ + L = new NodePositionList(); + L.addLast(in_e); + c = new DefaultComparator(); + } + + + @@ -83,6 +97,11 @@ public class OrderedListSet implements Set { return L.toString(); } + + + + + //////////////////////// inner class override methods from merge template ///// protected class MergeUnion extends MergeTemplate{