1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
| template <class TypeOfVer, class TypeOfEdge> class adjListGraph:public graph<TypeOfVer, TypeOfEdge> { public: adjListGraph(int vSize, const TypeOfVer d[]); void insert(TypeOfVer x, TypeOfVer y, TypeOfEdge w); void remove(TypeOfVer x, TypeOfVer y); bool exist(TypeOfVer x, TypeOfVer y) const; ~adjListGraph() ; private: struct edgeNode { int end; TypeOfEdge weight; edgeNode *next; edgeNode(int e, TypeOfEdge w, edgeNode *n = NULL) { end = e; weight = w; next = n;} }; struct verNode{ TypeOfVer ver; edgeNode *head; verNode(edgeNode *h = NULL) { head = h;} }; verNode *verList; int find(TypeOfVer v) const { for (int i = 0; i < Vers; ++i) if (verList[i].ver == v) return i; } };
template <class TypeOfVer, class TypeOfEdge> adjListGraph<TypeOfVer, TypeOfEdge> ::adjListGraph(int vSize, const TypeOfVer d[]) { Vers = vSize; Edges = 0; verList = new verNode[vSize]; for (int i = 0; i < Vers; ++i) verList[i].ver = d[i]; }
template <class TypeOfVer, class TypeOfEdge> adjListGraph<TypeOfVer, TypeOfEdge>::~adjListGraph() { int i; edgeNode *p; for (i = 0; i < Vers; ++i) { while ((p = verList[i].head) != NULL) { verList[i].head = p->next; delete p; } } delete [] verList; }
template <class TypeOfVer, class TypeOfEdge> void adjListGraph<TypeOfVer, TypeOfEdge>:: insert(TypeOfVer x, TypeOfVer y, TypeOfEdge w) { int u = find(x), v = find(y); verList[u].head = new edgeNode(v, w, verList[u].head ); ++Edges; }
template <class TypeOfVer, class TypeOfEdge> void adjListGraph<TypeOfVer,TypeOfEdge>::remove(TypeOfVer x,TypeOfVer y) { int u = find(x), v = find(y); edgeNode *p = verList[u].head, *q; if (p == NULL) return; if (p->end == v) { verList[u].head = p->next; delete p; --Edges; return; } while (p->next != NULL && p->next->end != v) p = p->next; if (p->next != NULL) { q = p->next; p->next = q->next; delete q; --Edges; } }
template <class TypeOfVer, class TypeOfEdge> bool adjListGraph<TypeOfVer, TypeOfEdge> ::exist(TypeOfVer x, TypeOfVer y) const { int u = find(x), v = find(y); edgeNode *p = verList[u].head; while (p !=NULL && p->end != v) p = p->next; if (p == NULL) return false; else return true; }
|