#include #include "Fields.h" #include "Dllist.h" #include "rbTree.h" #include "jrb.h" class Edge; class Vertex { protected: string name; dList edges; public: Vertex(string n) { name = n; } string getName() { return name; } void firstEdge() { edges.first(); } void nextEdge() { edges.next(); } bool endOfEdges() { return edges.endOfList(); } Edge *getEdge() { return edges.get(); } void addEdge(Edge *e) { edges.append(e); } }; class Edge { public: Edge(Vertex *vtx1, Vertex *vtx2) { v1 = vtx1; v2 = vtx2; } Vertex *getVertex1() { return v1; } Vertex *getVertex2() { return v2; } protected: Vertex *v1; Vertex *v2; }; class Graph { protected: rbTree vertices; public: Vertex *find(string name) { if (vertices.find(name)) return (Vertex *)vertices.getVal().v; else return 0; } Vertex *insert(string name) { vertices.insert(name, new_jval_v(new Vertex(name))); return (Vertex *)vertices.getVal().v; } void firstVertex() { vertices.first(); } void nextVertex() { vertices.next(); } bool endOfVertices() { return vertices.endOfList(); } Vertex *getVertex() { return (Vertex *)vertices.getVal().v; } }; main() { Fields *f; Graph g; Vertex *v; Vertex *v2; Edge *e; string s; v = 0; f = new Fields(); while (f->get_line() >= 0) { if (f->get_NF() > 0) { if (f->get_field(0) == "CLASS") { if (f->get_NF() != 2) { fprintf(stderr, "%d: CLASS name\n", f->get_line_number()); exit(1); } s = f->get_field(1); v = g.find(s); if (v == 0) { v = g.insert(s); } } else if (f->get_field(0) == "PREREQ") { if (f->get_NF() != 2) { fprintf(stderr, "%d: PREREQ class\n", f->get_line_number()); exit(1); } if (v == 0) { fprintf(stderr, "%d: PREREQ -- no current vertex\n", f->get_line_number()); exit(1); } s = f->get_field(1); v2 = g.find(s); if (v2 == 0) { v2 = g.insert(s); } e = new Edge(v2, v); v2->addEdge(e); } else { fprintf(stderr, "%d: lines must be CLASS or PREREQ\n", f->get_line_number()); exit(1); } } } for (g.firstVertex(); !g.endOfVertices(); g.nextVertex()) { v = g.getVertex(); printf("Class %s\n", v->getName().c_str()); for (v->firstEdge(); !v->endOfEdges(); v->nextEdge()) { e = v->getEdge(); printf(" is a prereq for %s\n", e->getVertex2()->getName().c_str()); } printf("\n"); } }