/***************************  Graph.java  *************************************/

/** Abstrakter Datentyp Graph mit den Methoden number, insert, reset,
    moreNeighbors, nextNeighbor
 */   

public class Graph {

  private Liste[] g;                   // g ist ein Array von Listen

  public Graph(int n) {                // Konstruktor fuer Graph mit n Knoten
    g = new VerweisListe[n];           // besorge Platz fuer Array mit n Listen
    for (int i=0; i < n; i++)          // besorge n mal
      g[i] = new VerweisListe();       // Platz fuer eine Liste 
  }

  public int number() {                // liefere Zahl der Knoten
    return g.length;
  }

  public void insert(int i, int j){    // fuege fuer Knoten i den Nachbarn j ein
    g[i].insert(new Integer(j));
    g[i].advance();
  }

  public void reset(int i) {           // setze Nachbarschaftsliste i zurueck
    g[i].reset();
  }

  public void reset() {                // setze Nachbarschaftslisten zurueck
    for (int i=0; i<g.length; i++)
      g[i].reset();
  }

  public boolean moreNeighbors(int i){ // teste, ob i weitere Nachbarn hat
    return !g[i].endpos();
  }

  public int nextNeighbor(int i) {     // liefere den naechsten Nachbarn
    Object o = g[i].elem();            // von Knoten i 
    g[i].advance();                    // und ruecke eins weiter
    return ((Integer)o).intValue();    // liefere als int
  }
}
