Dana jest struktura
struct Vertex{ const int id;};
void add_last(Node** list, Vertex& elem); // dodaje element na koniec listy (może być pusta) void add_first(Node** list, Vertex& elem); // dodaje element na początek listy (może być pusta) void add(Node** list, Vertex& elem, int nr); // dodaje element na pozycję nr licząc od zera void del_last(Node** list); // usuwa element z końca listy (może być pusta) void del_first(Node** list); // usuwa element z początku listy (może być pusta) void del(Node** list, int nr); // usuwa element z podanej pozycji w liście (może być pusta)
Wykorzystując operacje listowe zdefiniowane powyżej zaimplementuj strukturę o nazwie Graph, realizującą wybrane opracje na grafach skierowanych zaimplementowanych poprzez listę sąsiadów.
void init(Graph** g, int N); // tworzy nowy graf o N wierzchołkach, graf nie ma połączeń, ale ma wszystkie wierzchołki void add_edge(Graph* g, int id1, int id2); // dodaje krawędź łączącą wierzchołki o indeksach id1 oraz id2 void del_edge(Graph* g, int id1, int id2); // usuwa krawędź łączącą wierzchołki o indeksach id1 oraz id2 void print(Graph* g); // wyświetla graf na standardowe wyjście. Każdy wiersz wyjścia ma postać: id_wierzcholka -> lista sasiadow