#include "graph.h" // Описание родительского класса
// Описание шаблона классов для представления
// простых однонаправленных списков
template <class T>
class List {
// Внутренний класс для представления элементов списка
struct Listltem {
Т item; // Собственно элемент списка
Listltem *next; // Ссылка на следующий элемент списка
// Конструктор элементов введен для удобства реализации операций
Listltem(const T fiitem, Listltem *next = NULL)
{
Listltem::item = item;
Listltem::next = next; }
};
// Список представлен ссылками на первый и последний элементы...
Listltem *first, *last;
// ...а также счетчиком числа элементов
int count;
public:
// Конструктор пустого списка - единственный в нашем описании
List() { first = last = NULL; count = 0; )
// Операции добавления элемента...
void add(const T &);
// ...и проверки наличия элемента в списке
bool has(const T &) const;
};
// Собственно описание класса для представления L-графа
class ListGraph : public Graph {
// Массив списков целых, каждое из которых задает
// номер вершины, в которую входит дуга. Индексы в массиве
// задают номера вершин, из которых эти дуги исходят.
List<int> *graph;
// Количество вершин в графе.
int vertexNumber;
public:
// Конструктор порождает N списков и инициализрует массив этих
// списков, запоминая количество вершин, заданное аргументом
ListGraph(int n) { graph = new List<int>[vertexNumber = n]; }
// Операция подсчета вершин просто выдает запомненное ранее значение
int vertexCount() const { return vertexNumber; 1
// Две следующие функции реализуют операции над дугами
void addArc(int from, int to);
bool hasArc(int from, int to) const;
};