#ifndef _graph_hpp_ #define _graph_hpp_ #include "vector.hpp" #include #include #include // #define gNodeArray(T) binNode * template class Edge { public: Te data; int weight; Edge() { weight = 0; } Edge(int w) { weight = w; } Edge(Te d, int w) { data = d; weight = w; } }; template class Vertex { public: Tv data; int inDegree; int outDegree; Vertex() { // data = NULL; inDegree = 0; outDegree = 0; } Vertex(Tv d) { data = d; inDegree = 0; outDegree = 0; } }; template class graphVertex { private: Vector *> V; Vector *>> E; int v; int e; public: graphVertex() { v = 0; e = 0; } ~graphVertex() { int n = v; for (int j = 0; j < n; j++) for (int k = 0; k < n; k++) delete E[j][k]; for (int j = 0; j < n; j++) delete V[j]; } virtual Tv vertex(int i) { return V[i]->data; } virtual int inDegree(int i) { return V[i]->inDegree; } virtual int outDegree(int i) { return V[i]->outDegree; } virtual int insect(int id, Tv value) { // if (V[id] == NULL) // { Vertex *temp1 = new Vertex(value); V.put(id, temp1); // } // else // V[id]->data = value; v++; return id; } virtual Tv remove(int id) { for (int j = 0; j < v; j++) { if (E[id][j] != NULL) { delete E[id][j]; E[id].put(j, NULL); V[j]->inDegree--; } } v--; Tv temp = vertex(id); delete V[id]; V.put(id, NULL); return temp; } // id1->id2 进行连接 // return: // -1 顶点不存在 // -2 边已存在 // 0 成功 virtual int link(int id1, int id2, int w) { if (V[id1] == NULL || V[id2] == NULL) return -1; if (E[id1][id2] != NULL) return -2; V[id1]->outDegree++; V[id2]->inDegree++; e++; Edge *temp = new Edge(w); (E[id1]).put(id2, temp); return 0; } // 解除 id1->id2 连接 // return: // -1 顶点不存在 // -2 边不存在 // 0 成功 virtual int unlink(int id1, int id2) { if (V[id1] == NULL || V[id2] == NULL) return -1; if (E[id1][id2] != NULL) return -2; V[id1]->outDegree--; V[id2]->inDegree--; delete E[id1][id2]; e--; return 0; } virtual void display() { std::cout << std::left << std::setw(5) << " "; for (int i = 0; i < V._len; i++) if (V[i] != NULL) std::cout << std::setw(4) << i << std::setw(10) << V[i]->data; printf("\n"); for (int i = 0; i < V._len; i++) if (V[i] != NULL) { std::cout << std::setw(4) << i << std::setw(10) << V[i]->data; for (int j = 0; j < E[i]._len;j++) if(E[i][j]==NULL) std::cout << std::setw(14) << "-"; else std::cout<< std::setw(14) << E[i][j]->weight; printf("\n"); } } }; #endif