/* * graph.cpp * * Created on: 13.01.2015 г. * Author: trifon */ #include "linked_list.cpp" template bool member(LinkedListIterator it, T const& x) { while (it && *it != x) ++it; return it; } template bool member(LinkedList const& l, T const& x) { return member(l.begin(), x); } template class Graph { private: typedef LinkedListIterator VI; typedef LinkedListIterator > SI; LinkedList > graph; LinkedList* findSuccessorsList(V const& v) { for(SI sit = graph.begin(); sit; ++sit) if (*(*sit).begin() == v) return &*sit; return NULL; } LinkedList const* findSuccessorsList(V const& v) const { for(SI sit = graph.begin(); sit; ++sit) if (*(*sit).begin() == v) return &*sit; return NULL; } public: LinkedList vertices() const { LinkedList v; for(SI sit = graph.begin(); sit; ++sit) v.insertEnd(*(*sit).begin()); return v; } VI successors(V const& v) const { LinkedList const* sl = findSuccessorsList(v); if (sl == NULL) return VI(); VI it = sl->begin(); ++it; return it; } bool isEdge(V const& a, V const& b) const { return member(successors(a), b); } // Не правим проверка за коректност! void addVertex(V const& v) { LinkedList sl; sl.insertEnd(v); graph.insertEnd(sl); } // Не правим проверка за коректност! void addEdge(V const& a, V const& b) { LinkedList* sl = findSuccessorsList(a); if (sl != NULL) sl->insertEnd(b); } void removeEdge(V const& a, V const& b) { LinkedList* sl = findSuccessorsList(a); V tmp; if (sl != NULL) { VI it = sl->begin(), prev = it; ++it; for(; it; ++it, ++prev) if (*it == b) sl->deleteAfter(tmp, prev); } } void removeVertex(V const& v) { // изтриваме входящите ребра for(VI it = succesors(v); it; ++it) removeEdge(*it, v); // vзтриваме самия списък от наследници за v LinkedList tmp; for(SI sit = graph.begin(); sit; ++sit) if (*(*sit).begin() == v) graph.deleteAt(tmp, sit); } };